파이썬을 쉽게 설치할 수 있도록 도와주는 pyenv 와 가상환경을 분리하여 관리할 수 있는 virtualenv 사용법에 대해 알아본다.
pyenv 및 python 설치 후 virtualenv 가상환경 생성하기
Step 1: pyenv 설치
다음의 명령어를 이용하여 pyenv 를 설치한다.
curl https://pyenv.run | bash
Step 2: Shell 환경에 pyenv 설정 반영
다음의 내용을 .bashrc 스크립트에 추가하여 pyenv 가 shell 시작 시 자동으로 로드되도록 만든다.
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
서버에 다시 접속하여 다음과 같이 pyenv 가 제대로 동작하는지 확인한다. 여기에서는 버전을 한번 출력해 보았다.
pyenv --version
pyenv 2.4.1
Step 3: 필요한 버전의 python 설치
아래와 같이 pyenv 를 통하여 python 3.11.8 버전을 설치한다.
pyenv install 3.11.8
성공한 경우 아래의 메시지를 볼 수 있다.
Downloading Python-3.11.8.tar.xz...
-> https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tar.xz
Installing Python-3.11.8...
Installed Python-3.11.8 to /home/ubuntu/.pyenv/versions/3.11.8
다음과 같은 명령을 이용하면 현재 pyenv 로부터 설치되어 있는 버전들을 확인해볼 수 있다. system 외에 3.11.8 버전이 추가된 것을 볼 수 있다.
pyenv versions
* system (set by /home/ubuntu/.pyenv/version)
3.11.8
(참고) 만약 python 설치에 에러가 있었다면 시스템에서 필요한 라이브러리가 제대로 설치되어 있지 않기 때문일 수 있다. 아래의 명령어를 통해 필요 라이브러리들을 설치 후 다시 한번 시도를 해보는 것을 권장한다.
sudo apt-get install -y \
make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev \
libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils \
tk-dev libffi-dev liblzma-dev python-openssl git
Step 4: 가상 환경 생성 및 확인
앞서 설치한 python 3.11.8 버전 기반으로 py311 라는 이름의 가상환경을 생성한다.
pyenv virtualenv 3.11.8 py311
추가된 가상환경은 아래와 같이 확인할 수 있다.
pyenv virtualenvs
3.11.8/envs/py311 (created from /home/ubuntu/.pyenv/versions/3.11.8)
py311 (created from /home/ubuntu/.pyenv/versions/3.11.8)
(참고) 만약 python 을 설치하지 않고 가상환경을 만든다면 다음과 같은 에러가 발생한다. 예를 들어 앞서 미리 설치되지 않은 3.11.5 라는 버전에 대해 가상환경을 생성하려는 시도를 해 보았다.
pyenv virtualenv 3.11.5 py311
그러면 다음과 같이 pyenv 에 설치되어 있지 않은 파이썬 버전이므로 파이썬 설치부터 먼저 진행하라는 안내 문구가 나온다.
pyenv-virtualenv: `3.11.5' is not installed in pyenv.
Run `pyenv install 3.11.5' to install it.
Step 5: 가상환경 적용 (activate)
다음의 명령어를 통하여 가상환경을 적용시킬 수 있다.
pyenv activate py311
가상 환경이 적용되면 명령줄 프롬프트의 맨 앞에 (py311)
이 추가된다.
(py311) ubuntu@ip-10-144-193-3:~$
다음과 같이 파이썬 버전이 가상환경에서 사용되는 3.11.8 버전으로 변경된 것을 확인할 수 있다.
python3 --version
Python 3.11.8
Step 6: 적용된 가상환경 해제 (deactivate)
다음의 명령어를 통하여 적용된 가상환경을 해제시킬 수 있다.
pyenv deactivate
가상 환경이 해제되면 명령줄 프롬프트에 있던 (py311)
표시가 사라진다.
ubuntu@ip-10-144-193-3:~$
다음과 같이 파이썬 버전이 3.8.10 으로 되돌아 온 것을 확인해 볼 수 있다.
python3 --version
Python 3.8.10
Step 7: 해당 폴더에 가상환경 적용
일단 현재 상태의 python 버전을 확인해 보면, 3.8.10 버전으로 잡혀있는 것을 볼 수 있다.
python3 --version
Python 3.8.10
가상환경이 적용될 폴더를 위해 임시로 project
라는 이름의 폴더를 만들고 해당 폴더로 들어가 가상환경을 적용해 보았다.
cd project
pyenv local py311
해당 폴더 내에 .python-version
이라는 파일이 생성되며,
명령줄 프롬프트 앞에 (py311)
도 붙어있는 것을 확인할 수 있다.
cat .python-version
py311
또한 이 폴더 내에서 파이썬 버전을 살펴보면 기존 system 버전인 3.8.10 이 아닌 3.11.8 버전으로 잡혀있는 것을 볼 수 있다.
python3 --version
Python 3.11.8
pyenv 삭제하기
pyenv 삭제는 별도의 과정이 필요 없이 해당 폴더나 파일들만 제대로 지워주면 된다.
Step 1. pyenv 폴더 삭제
사용자의 홈 디렉토리에서 .pyenv
폴더를 삭제한다.
cd ~
rm -rf .pyenv
Step 2. pyenv 관련하여 추가된 설정 제거
pyenv 를 설치하면서 추가한 .bashprofile
혹은 .bashrc
파일 내 라인들을 제거한다.
Step 3. (선택 사항) 각 프로젝트 폴더 내 .python-version
파일 삭제하기
각 프로젝트 폴더 내 .python-version
파일들을 삭제한다.
나중에 pyenv 를 다시 설치하면서 동일한 가상환경 이름을 사용한다면 굳이 삭제하지 않아도 되겠지만 깔끔하게 하기 위해 삭제할 것을 권장한다.
Errors
ModuleNotFoundError: No module named …
파이썬 설치 시 시스템 내 특정 라이브러리를 찾지 못하는 경우에 에러가 발생할 수 있다.
sukjun@207f9fbfcb7b:~$ pyenv install 3.8
Downloading Python-3.8.19.tar.xz...
-> https://www.python.org/ftp/python/3.8.19/Python-3.8.19.tar.xz
Installing Python-3.8.19...
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/sukjun/.pyenv/versions/3.8.19/lib/python3.8/ctypes/__init__.py", line 7, in <module>
from _ctypes import Union, Structure, Array
ModuleNotFoundError: No module named '_ctypes'
WARNING: The Python ctypes extension was not compiled. Missing the libffi lib?
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/sukjun/.pyenv/versions/3.8.19/lib/python3.8/sqlite3/__init__.py", line 23, in <module>
from sqlite3.dbapi2 import *
File "/home/sukjun/.pyenv/versions/3.8.19/lib/python3.8/sqlite3/dbapi2.py", line 27, in <module>
from _sqlite3 import *
ModuleNotFoundError: No module named '_sqlite3'
WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?
Installed Python-3.8.19 to /home/sukjun/.pyenv/versions/3.8.19
위의 에러에서는 libffi 와 SQLite3 라이브러리가 없어서 아래와 같이 별도로 설치한 뒤에 다시 파이썬을 설치하였다.
sudo apt-get install -y libffi-dev libsqlite3-dev