[Python] 가상 환경 세팅을 어떻게 할까요? (Pyenv + Poetry)

devhans·2024년 7월 15일

Python

목록 보기
7/8
post-thumbnail

배경

Python 개발환경을 Anaconda를 통해 python version 관리를 진행했었습니다.
그러나 Python으로 하는 일이 많아지면서 개인 프로젝트가 아닌 사내에서 Anaconda의 사용을 고려해야 했습니다.

Anaconda는 기본 패키지를 너무 많이 포함하고 있어 무겁고, 200명이 넘는 집단은 사용하려면 라이센스 비용을 내야 한다는 문제가 있습니다.
가장 간단한 해결책은 라이센스 문제가 없는 Miniconda를 사용하면 됩니다.
Miniconda는 Anaconda의 구동에 필요한 핵심적인 패키지를 제외하면 다른 패키지는 설치하지 않은 경량화 버전입니다.
그럼에도 불구하고 Miniconda 역시 기본적인 Anaconda에 들어가는 패키지를 포함하므로 사용하지 않는 패키지를 계속 관리해야 합니다.

다른 대안이 없을까 찾아보면서 2023년 pycon KR에서 소개한 poetry를 알게 됐습니다. poetry는 java에서 gradle과 비슷하게 의존성을 관리해주는 도구입니다. 기존의 가상환경과 달리 프로젝트 별로 의존성을 관리할 수 있어 편리합니다. pyenv와 결합하면 기존 시스템 Python 환경을 건드리지 않고 파이썬 버전을 추가하여 관리할 수 있습니다.

pyenv + poetry를 사용하는 방법을 자세히 포스팅 해두려 합니다.

사용법

Window

pyenv 설치(window)

pyenv-winQuick Installation을 참고하여 설치합니다.

  1. PowerShell에서 pyenv-win을 설치합니다.
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"
  1. PowerShell을 다시 엽니다.

  2. 정상적으로 설치됐는지 명령어를 입력해 확인합니다.

pyenv --version

  1. pyenv-win으로 설치할 수 있는 Python 버전을 확인합니다.
    이때, python 공식 미러사이트를 이용하기 때문에 window와 linux에서 설치할 수 있는 버전이 다릅니다.
pyenv install -l

  1. 지원되는 버전을 선택하여 설치합니다.
pyenv install <version>

  1. 설치한 Python 버전을 global version으로 설정합니다.
pyenv global <version>

  1. Python 버전의 경로가 설정한 버전이 맞는지 확인합니다.
> pyenv version
<version> (set by \path\to\.pyenv\pyenv-win\.python-version)

  1. Python이 동작하는지 명령어를 실행해서 확인합니다.
> python -c "import sys; print(sys.executable)"

potery 설치(window)

https://python-poetry.org/docs/#installing-with-the-official-installer 를 참고하여 설치합니다.

  1. powershell에서 실행하여 poetry를 설치합니다.
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -

  1. 환경변수를 추가합니다.
> [System.Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Users\{USER_NAME}\AppData\Roaming\Python\Scripts", [System.EnvironmentVariableTarget]::User)

  1. Powershell을 재시작합니다.
  2. 정상적으로 환경변수 까지 잡혔는지 확인합니다.
poetry --version

pycharm에서 가상환경 사용하기

  1. New Project를 생성합니다.
    여기서는 test-python-project 프로젝트를 만들 것입니다.
    poetry를 통해 다시 격리된 가상환경을 만들것이므로 초기 설정은 중요하지 않습니다.
    그래도 일단 pyenv를 통해 설치한 python 을 interpreter로 설정하겠습니다.
> python -c "import sys; print(sys.executable)"
C:\Users\hayt\.pyenv\pyenv-win\versions\3.9.13\python.exe

아래의 설정을 따라서 프로젝트를 생성해주세요.
Interperter type: Custom environment
Environment : select existing
Type : Python
Python path : C:\Users\hayt\.pyenv\pyenv-win\versions\3.9.13\python.exe

  1. 프로젝트가 열리면 Base Interperet설정을 변경합니다.
    File > Settings 선택

    interpreter를 검색 > Project에서 Pyhthon Interpreter > Add Interpreter > Add Local Interpreter

    Poetry Environment > Poetry executable 설정 > OK 클릭
    경로 : C:\Users\{user_nm}\AppData\Roaming\pypoetry\venv\Scripts\poetry.exe
    이때 정상적으로 설정 된다면 Base interpreter도 자동으로 잡힙니다. 만약 Base Interpreter가 자동으로 설정되지 않는다면 위 경로의 Scripts 디렉토리의 python.exe를 선택합니다.
  2. pycharm 에서 확인
    정상적으로 pyenv환경을 설정하면 아래와 같이 pyproject.toml이 생성됩니다.
  3. 어떤 Python Interpreter를 활용하는지 파이썬 파일을 실행해 확인합니다.
import sys
print(sys.executable)


격리된 가상환경 test-python-project-_yFcv4rt-py3.9를 사용하고 있음을 콘솔창에서 확인할 수 있습니다.

CentOS 7.9에서 구성하기

저의 경우엔 CentOS 7.9에 배포해야 했습니다.
CentOS Linux release 7.9.2009 (Core)는 OpenSSL이 1.0.2가 가장 최신 버전입니다.
그러나 poetry는 OpenSSL 1.1.1+를 사용하므로 업그레이드를 따로 해주셔야 합니다.

CentOS 7.9는 제품 수명 종료(EOL)되어 repo가 deprecated 됐습니다.

CentOS-Base.repo를 수정해야 yum 명령어를 정상적으로 실행할 수 있습니다.
필요하신 분은 해당 링크를 참고하여 CentOS-Base.repo를 수정해주세요

  1. openssl 버전 업그레이드진행
sudo yum -y update
sudo yum update 
cd /usr/local/src
sudo wget https://www.openssl.org/source/openssl-1.1.1n.tar.gz
sudo tar xzf openssl-1.1.1n.tar.gz
cd openssl-1.1.1n
sudo ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib
sudo make
sudo make install
sudo mv /usr/bin/openssl /usr/bin/openssl.bak
sudo ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
  1. ~/.bashrc에 아래 내용 추가
export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATH
  1. pkgconfig를 통한 설정 저장
    pkgconfig를 구성해보겠습니다.
sudo yum install -y pkgconfig
sudo tee /usr/lib64/pkgconfig/openssl11.pc <<EOF
prefix=/usr/local/openssl
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: OpenSSL
Description: Secure Sockets Layer and cryptography libraries and tools
Version: 1.1.1n
Libs: -L${libdir} -lssl -lcrypto
Cflags: -I${includedir}
EOF

네트워크 연결시 pyenv 설치

  1. pyenv-installer 를 통한 설치
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
  1. pyenv 환경변수 설정
    ~/.bash_profile, ~/.bashrc에 아래 내용 추가
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
  1. 쉘 재시작

  2. 빌드 오류 해결
    REF : https://github.com/pyenv/pyenv/wiki/Common-build-problems#prerequisites

sudo yum install -y openssl-devel bzip2-devel readline-devel sqlite-devel libffi-devel lzma xz-devel python-backports-lzma
  1. pyenv를 통해 원하는 버전의 파이썬 설치
    openssl 버전 1.1.1+을 사용하는 임의 버전이라 아래와 같이 입력하여 설치합니다.
CFLAGS="-I/usr/local/openssl/include " LDFLAGS="-L/usr/local/openssl/lib -lssl -lcrypto" pyenv install -v 3.9.19

참고로 플래그의 실제 값은 아래와 같습니다.

폐쇄망에서 pyenv 설치

https://github.com/pyenv/pyenv/releases 에서 pyenv 원하는 버전(pyenv-x.x.x.tar.gz)을 다운받습니다.
https://www.python.org/downloads/source/에서 원하는 파이썬 버전(Python-x.x.x.tar.xz)을 다운받습니다.

  1. pyenv-x.x.x.tar.gz를 받으셨다면 ~/에서 압축을 풀어줍니다.
mv pyenv-x.x.x.tar.gz .pyenv
  1. 압축 해제된 폴더명을 .pyenv로 변경하고 내부에 cache 폴더를 생성합니다.
mkdir -p ~/.pyenv/cache/
  1. 원하는 버전을 cache 폴더에 넣고 파이썬을 설치합니다.
mv ```Python-x.x.x.tar.xz``` ~/.pyenv/cache/
CFLAGS="-I/usr/local/openssl/include " LDFLAGS="-L/usr/local/openssl/lib -lssl -lcrypto" pyenv install -v x.x.x

네트워크 연결시 poetry 설치

  1. 아래 명령어를 통해 설치할 수 있습니다.
curl -sSL https://install.python-poetry.org | python3 -
  1. ./~bashrc에 poetry의 경로를 추가합니다.
export PATH="/home/{유저명}/.local/bin:$PATH"

폐쇄망에서 poetry 설치

poetry_dist.tar.gz 만들기

  1. 임시 폴더를 하나 생성합니다.
mkdir -p /tmp/poetry_dist && cd /tmp/poetry_dist
  1. poetry_install을 다운받습니다.
curl -o poetry_install.py -sSL https://install.python-poetry.org
  1. 아래 명령어를 실행합니다.
sed -i 's/"install", specification/"install", "--no-index", "--find-links=.", specification/g' poetry_install.py
  1. 원하는 버전의 poetry 가 있는지 확인합니다.
pip index versions poetry
  1. pip으로 특정 버전의 poetry에 필요한 whl파일을 다운받습니다.
env VER=1.8.3 bash -c 'pip download poetry==$VER'
  1. poetry 배포에 필요한 파일을 압축합니다.
tar -czvf poetry_dist.tar.gz poetry_install.py *.whl --remove-files

tar.gz 파일로 배포된 poetry 설치

  1. 임시 폴더를 하나 생성합니다.
mkdir -p /tmp/poetry_dist && mv poetry_dist.tar.gz /tmp/poetry_dist && cd /tmp/poetry_dist
  1. 압축파일을 해제합니다.
tar -xzvf poetry_dist.tar.gz
  1. 배포한 버전에 맞춰 설치합니다.
env VER=1.8.3 bash -c 'python poetry_install.py --path $(ls poetry-$VER*.whl)'
  1. 필요없어진 whl 파일과 설치 스크립트를 삭제합니다.
rm poetry_install.py *.whl
  1. ./~bashrc에 poetry의 경로를 추가합니다.
export PATH="/home/{유저명}/.local/bin:$PATH"
  1. 정상적으로 설치됐는지 확인합니다.
poetry --version
profile
책 읽고 운동하기

0개의 댓글