Python 개발환경을 Anaconda를 통해 python version 관리를 진행했었습니다.
그러나 Python으로 하는 일이 많아지면서 개인 프로젝트가 아닌 사내에서 Anaconda의 사용을 고려해야 했습니다.
Anaconda는 기본 패키지를 너무 많이 포함하고 있어 무겁고, 200명이 넘는 집단은 사용하려면 라이센스 비용을 내야 한다는 문제가 있습니다.
가장 간단한 해결책은 라이센스 문제가 없는 Miniconda를 사용하면 됩니다.
Miniconda는 Anaconda의 구동에 필요한 핵심적인 패키지를 제외하면 다른 패키지는 설치하지 않은 경량화 버전입니다.
그럼에도 불구하고 Miniconda 역시 기본적인 Anaconda에 들어가는 패키지를 포함하므로 사용하지 않는 패키지를 계속 관리해야 합니다.
다른 대안이 없을까 찾아보면서 2023년 pycon KR에서 소개한 poetry를 알게 됐습니다. poetry는 java에서 gradle과 비슷하게 의존성을 관리해주는 도구입니다. 기존의 가상환경과 달리 프로젝트 별로 의존성을 관리할 수 있어 편리합니다. pyenv와 결합하면 기존 시스템 Python 환경을 건드리지 않고 파이썬 버전을 추가하여 관리할 수 있습니다.
pyenv + poetry를 사용하는 방법을 자세히 포스팅 해두려 합니다.
pyenv-win 의Quick Installation을 참고하여 설치합니다.
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"
PowerShell을 다시 엽니다.
정상적으로 설치됐는지 명령어를 입력해 확인합니다.
pyenv --version

pyenv install -l

pyenv install <version>

pyenv global <version>

> pyenv version
<version> (set by \path\to\.pyenv\pyenv-win\.python-version)

> python -c "import sys; print(sys.executable)"

https://python-poetry.org/docs/#installing-with-the-official-installer 를 참고하여 설치합니다.
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -

> [System.Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Users\{USER_NAME}\AppData\Roaming\Python\Scripts", [System.EnvironmentVariableTarget]::User)

poetry --version

> 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



C:\Users\{user_nm}\AppData\Roaming\pypoetry\venv\Scripts\poetry.exeScripts 디렉토리의 python.exe를 선택합니다.
pyproject.toml이 생성됩니다.
import sys
print(sys.executable)

격리된 가상환경 test-python-project-_yFcv4rt-py3.9를 사용하고 있음을 콘솔창에서 확인할 수 있습니다.
저의 경우엔 CentOS 7.9에 배포해야 했습니다.
CentOS Linux release 7.9.2009 (Core)는 OpenSSL이 1.0.2가 가장 최신 버전입니다.
그러나 poetry는 OpenSSL 1.1.1+를 사용하므로 업그레이드를 따로 해주셔야 합니다.
CentOS-Base.repo를 수정해야 yum 명령어를 정상적으로 실행할 수 있습니다.
필요하신 분은 해당 링크를 참고하여 CentOS-Base.repo를 수정해주세요
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
~/.bashrc에 아래 내용 추가export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATH
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
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
~/.bash_profile, ~/.bashrc에 아래 내용 추가export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
쉘 재시작
빌드 오류 해결
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
CFLAGS="-I/usr/local/openssl/include " LDFLAGS="-L/usr/local/openssl/lib -lssl -lcrypto" pyenv install -v 3.9.19
참고로 플래그의 실제 값은 아래와 같습니다.
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)을 다운받습니다.
pyenv-x.x.x.tar.gz를 받으셨다면 ~/에서 압축을 풀어줍니다.mv pyenv-x.x.x.tar.gz .pyenv
.pyenv로 변경하고 내부에 cache 폴더를 생성합니다.mkdir -p ~/.pyenv/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
curl -sSL https://install.python-poetry.org | python3 -
./~bashrc에 poetry의 경로를 추가합니다.export PATH="/home/{유저명}/.local/bin:$PATH"
mkdir -p /tmp/poetry_dist && cd /tmp/poetry_dist
curl -o poetry_install.py -sSL https://install.python-poetry.org
sed -i 's/"install", specification/"install", "--no-index", "--find-links=.", specification/g' poetry_install.py
pip index versions poetry
env VER=1.8.3 bash -c 'pip download poetry==$VER'
tar -czvf poetry_dist.tar.gz poetry_install.py *.whl --remove-files
mkdir -p /tmp/poetry_dist && mv poetry_dist.tar.gz /tmp/poetry_dist && cd /tmp/poetry_dist
tar -xzvf poetry_dist.tar.gz
env VER=1.8.3 bash -c 'python poetry_install.py --path $(ls poetry-$VER*.whl)'
rm poetry_install.py *.whl
./~bashrc에 poetry의 경로를 추가합니다.export PATH="/home/{유저명}/.local/bin:$PATH"
poetry --version