먼저 python 개발환경을 구성하는데 있어서 왜 virtualenv를 사용하게 되는지에 대한 이유를 잘 정리한 블로그가 있어 스크랩 했습니다. 한번 읽어보시면 감을 잡는데 도움을 받을 수 있을 것 같습니다.
정리pip는 Python Package Index에서 패키지를 설치하는 도구입니다.virtualenv는 python, pip, PyPI 부터 설치된 라이브러리들의 복사본을 만듦으로써, 독립적인 파이썬 환경을 만들어주는 도구입니다.이는 여러분이 동시에 하나의 기기에서 여러개의 프로젝트가 가지는 다른 의존성을 다룰 수 있도록 디자인되었습니다.설치 관련 가이드는 virtualeng.org에서 찾을 수 있습니다.설치 후에, env라는 가상환경 폴더를 만들고 싶다면 virtualenv env 명령어를 실행시키면 됩니다.여러분의 각 프로젝트 마다 이러한 환경이 하나씩 필요하게 됩니다. 이 폴더들을 버전 컨트롤 시스템에서 제외하는것을 잊지 마세요.가상환경에서 python과 pip를 사용하고 싶다면, env/bin/python 그리고 env/bin/pip를 사용하면 됩니다.가상환경을 source env/bin/activate 스크립트로 활성화 시킬 수 있고 deactivate 명령어를 통해 비활성화 시킬 수 있습니다. 선택적이지만 개발을 조금 더 편하게 도와줄 것입니다.만일 여러분이 일반적인 파이썬 사용자라면 pip와 virtualenv는 서로 떨어질 수 없는 도구들일것입니다. 둘다 상대적으로 이해하기 간단하기에 이들을 명확히 이해하는 것을 추천합니다.
위의 블로그 발췌본에서 추가 할 내용이 있다면 각 프로젝트 마다 독립된 환경이 필요하며 추가된 각 환경 폴더는 버전 컨트롤 시스템에서 제외해야 겠지만, 다른 사람이 프로젝트의 내용을 확인하기 위해서는 프로젝트의 dependency가 되는 third party package (예를 들면 django나 flask 같은 웹 프래임워크와 같이 python 설치시에 내장되어 있지 않기 때문에 pip를 통해 따로 설치해야 하는 것들) 이름과 버전이 함께 명시되어 있어야 합니다. 간단한 방법으로는 pip freeze
명령을 활용해 requirements.txt 파일에 명시 해 두고 버전 컨트롤 시스템에 포함해 두는 것 입니다.(이렇게 해 놓을 경우 프로젝트를 처음 세팅하는 다른 사람들은 pip install -r requirements.txt
명령어를 통해 requirements.txt에 나열되어 있는 패키지들을 한번에 설치할 수 있습니다.)
virtualenv, pipenv, conda 모두 이러한 패키지를 관리하기 위한 툴이라고 보면 됩니다. (conda의 경우 Anaconda의 package 관리 툴이기 때문에 조금 특별하지만 같은개념으로 봐도 될 것 같습니다.)
pyenv는 위의 패키지 툴 보다는 상위의 개념이라고 보시면 됩니다. 위의 패키지 관리 툴들은 설치되어 있는 파이썬 인터프리터를 사용해 독립된 환경을 구성합니다. 그런데 만약에 다른 파이썬 버전을 사용해야 한다면 system에 설치한 파이썬을 지우고 새로 설치 하는등의 추가 작업이 필요합니다. pyenv는 이러한 문제를 해결하기 위해 shell 환경에서 여러가지 버전의 파이썬을 설치하고 관리 할 수 있도록 도와주는 도구입니다. 파이썬 인터프리터는 여러 종류가 있는데 pyenv를 사용하면 기본적으로 사용하는 Cpython 뿐만 아니라 PyPy, Jython, Anaconda 등의 다양한 파이썬 인터프리터를 설치 할 수 있습니다.
위에서 언급한 virtualenv, pipenv, conda 세 가지 패키지 관리 툴 중에서 conda는 조금 특별하다고 했는데 왜냐하면 conda에서는 package를 독립적인 환경에서 사용할 수 있게 도와줄 뿐만 아니라, pyenv와 비슷하게 여러가지 Cpython 버전을 설치해서 사용할 수 있기 때문입니다..
세 가지 툴 중에 하나를 선택해야 할 때 고려해 봐야 하는 것 들을 각각 비교해 보았습니다.
python 공식문서에서는 application dependency를 관리하기 위하여 pipenv를 사용하는 것을 권합니다. 따로 requirements.txt 파일을 관리할 필요도 없고, 프로젝트별로 격리된 환경을 사용할 수 있기 때문입니다. pipenv를 사용하는 가장 큰 이유는 dependency 관리 때문입니다.
conda를 사용하기 위해서는 Anaconda나 Anaconda 버전 중 하나인 miniconda를 설치해야만 사용할 수 있는데 주로 conda를 통해 받을 수 있는 데이터 관련 라이브러리를 사용하기 위해 이용됩니다.
pipenv와 conda는 서로 트레이드 오프가 있기 때문에 같이 사용한다면 범용적으로 사용할 수 있습니다.
예를 들면
일반 적인 경우 이렇게만 하면 필요한 파이썬 개발환경 구성은 완료됩니다.
만약 conda에서만 설치할 수 있는 패키지들이 필요하다면 conda를 설치한 후, pipenv 환경을 구축 할 때 --python={path}
옵션과 --site-package
옵션을 설정해서 conda에서 install한 package들을 사용할 수 있도록 구성합니다. 이렇게 사용 할 경우 conda를 통해 설치한 package들은 배포시 다른 설치방법이 필요 할 수도 있기 때문에 Pipfile에서는 제외 할 수 있도록 합니다.
결론
각각의 설치 방법과 간단한 활용 방법은 아래에서 확인할 수 있습니다.
github - https://github.com/ohmyzsh/ohmyzsh
zsh 설치 - brew install zsh
oh-my-zsh 설치 - sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
프로젝트 마다 python 버전과, pip으로 설치한 여러가지 써드파티 library를 “project 마다” 독립적인 환경에서 사용하기 위해 pyenv, pyenv-virtualenv를 함께 사용 하거나, pipenv를 사용한다.
github - https://github.com/pyenv/pyenv
pyenv command reference - https://github.com/pyenv/pyenv/blob/master/COMMANDS.md
pyenv란? - 파이썬 버전을 관리해 주는 툴
설치방법
brew update
brew install pyenv
export PYENV_ROOT=/usr/local/var/pyenvif which pyenv > /dev/null; then eval "$(pyenv init -)"; fiif which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -)"; fi
curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
export PATH="/home/{user_name}/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)"
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
pyenv 설치경로 확인
pyenv를 통해 설치된 파이썬 확인 경로
drwxr-xr-x 9 zoozoo admin 288B 12 8 21:28 . drwxr-xr-x 6 zoozoo admin 192B 7 16 14:28 .. drwxr-xr-x 8 zoozoo admin 256B 11 21 14:55 3.5.5 drwxr-xr-x 8 zoozoo admin 256B 11 22 14:33 3.6.5 lrwxr-xr-x 1 zoozoo admin 50B 7 20 18:35 dbtool-v4 -> /usr/local/var/pyenv/versions/3.5.5/envs/dbtool-v4 lrwxr-xr-x 1 zoozoo admin 51B 9 5 12:22 for_global -> /usr/local/var/pyenv/versions/3.5.5/envs/for_global lrwxr-xr-x 1 zoozoo admin 48B 12 8 21:28 poc-gui -> /usr/local/var/pyenv/versions/3.6.5/envs/poc-gui lrwxr-xr-x 1 zoozoo admin 52B 8 6 14:30 spider-hive -> /usr/local/var/pyenv/versions/3.5.5/envs/spider-hive lrwxr-xr-x 1 zoozoo admin 45B 7 16 14:28 test -> /usr/local/var/pyenv/versions/3.6.5/envs/test
간단한 사용방법
pyenv help
pyenv install -list
pyenv install {python version}
pyenv versions
python --version
명령어를 통해서는 현재 사용하고 있는 python 인터프리터 버전을 확인 할 수 있다.pyenv global {python version}
pyenv local {python version (or 가상환경 이름)}
pyenv local --unset
혹은 폴더 내의 .python-version 삭제기타
macos 모하비에서 pyenv를 통해 python을 설치하는데 아래와 같은 에러가 난다면
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
다음 명령어로 해결
xcode-select --install
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
miniconda docs - https://docs.conda.io/projects/conda/en/latest/index.html
miniconda란?
Continuum Analytics 사에서 제공하는 python distribution 인 Anaconda의 축소 버전
Anaconda와 miniconda의 차이점에 대해서 stackoverflow 답변
The difference is that miniconda is just shipping the repository management system. So when you install it there is just the management system without packages. Whereas with Anaconda, it is like a distribution with some built in packages.
ananconda가 cpython을 사용하는지 여부에 대한 답변(anaconda가 무엇인지 명확하게 설명해 준다.)
Anaconda is a Python distribution. It bundles CPython with several packages, especially ones that are useful for scientific computing, and some additional tools like Conda to manage packages and environments.
설치방법 - https://docs.conda.io/projects/conda/en/latest/user-guide/install/macos.html
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh -O ~/miniconda.sh
bash ~/miniconda.sh -b -p $HOME/miniconda
drwxr-xr-x 13 zoozoo staff 416B 3 6 10:33 .drwxr-xr-x+ 56 zoozoo staff 1.8K 3 6 11:00 ..-rw-r--r-- 1 zoozoo staff 4.0K 12 20 14:40 LICENSE.txtdrwxr-xr-x 70 zoozoo staff 2.2K 3 6 10:33 bindrwxr-xr-x 37 zoozoo staff 1.2K 3 6 10:33 conda-metadrwxr-xr-x 2 zoozoo staff 64B 3 6 10:33 envsdrwxr-xr-x 4 zoozoo staff 128B 3 6 10:33 etcdrwxr-xr-x 94 zoozoo staff 2.9K 3 6 10:33 includedrwxr-xr-x 100 zoozoo staff 3.1K 3 6 10:33 libdrwxr-xr-x 76 zoozoo staff 2.4K 3 6 10:33 pkgsdrwxr-xr-x 3 zoozoo staff 96B 3 6 10:33 python.appdrwxr-xr-x 8 zoozoo staff 256B 3 6 10:33 sharedrwxr-xr-x 9 zoozoo staff 288B 3 6 10:33 ssl
~/.zshrc
)export PATH="$HOME/miniconda/bin:$PATH"
source ~/.zshrc
conda --version
설치된 conda version을 확인할 수 있다.간단한 conda 사용법
conda env list
conda create --name {myenv} python=3.6
source activate
명령어로 가상 환경을 한번 load해 줘야 한다. 이런식으로 한번 로드 한 이후에는 conda activate
, conda deactivate
명령어를 통해 가상환경을 로드하거나 해제 할 수 있다. 터미널 종료 후에는 이러한 과정이 모두 리셋 되기 때문에 다시 source activate
명령어를 입력해야만 한다. 번거로움을 피하기 위해 그냥 source activate
명령어를 사용할 수도 있다.source activate {myenv}
(혹은 conda activate {myenv}
)source deactivate
(혹은 conda deactivate
)conda list
- pip로 설치한 패키지를 포함한 모든 패키지를 나열해 준다. (conda 명령어가 아닌 pip명령어로 설치한 패키지더라도 list에서 보여준다.)pip list
- pip로 설치한 리스트를 보여준다. (가상환경 안에서 사용한다면 pip는 가상환경 안에서 설치된 리스트를 보여주게 되고 conda list
는 가상환경과는 별개의 conda 환경에서 설치된 리스트를 보여주게 된다.)conda install {pacakge_name}
공식문서 - https://pipenv.readthedocs.io/en/latest/
github - https://github.com/pypa/pipenv
pip
and virtualenv
separately. They work together.requirements.txt
file can be problematic, so Pipenv uses the upcoming Pipfile
and Pipfile.lock
instead, which is superior for basic use cases.$ pipenv graph
)..env
files.pipenv --three
명령어로 python3 버전의 가상환경을 설치하려 할 경우 3버전은 사용할 수 없다. 따라서 가상환경에서 사용할 파이썬 버전이 필요한 경우 pyenv install 3.5.5
와 같이 pyenv를 통해 필요한 python version을 설치 한 후 pipenv를 활용해 독립된 가상환경을 사용한다..venv
폴더 안에 해당 프로젝트에 알맞은 가상환경을 구성할 수 있도록 한다. .venv
는 .gitignore
에 명시해 놓고 해당환경이 git에 포함되지 않도록 한다. Pipfile과 Pipfile.lock 파일은 프로젝트에 필요한 패키지를 확인하고 설치할 수 있는 파일이기 때문에 git에 포함하여 기록에 변동사항을 확인 할 수 있도록 한다.설치
brew install pipenv
pip install pipenv
(python이 깔려 있다면, 기본적으로 python을 설치하면 pip이 자동으로 설치되어 있다.)사용방법
가상환경을 시작하는 방법은 여러가지가 있지만 내가 사용하는 것들을 소개 (기본적인 사용법은 공식문서 확인하면 된다)
PIPENV_VENV_IN_PROJECT=true PIPENV_IGNORE_VIRTUALENVS=1 pipenv install --python 3.5.5
.venv
라는 이름으로 가상환경 파일이 생성된다.--python 3.5.5
의 경우 옵션으로 입력을 생략해도 된다. 일반적으로는 Pipfile의 requires세션안에 해당 프로젝트에서 사용하고 있는 python 버전을 기입하며, Pipfile에 기재된 파이썬 버전과 동일한 파이썬 버전을 시스템에서 가져와서 가상환경을 구성하게 된다. 즉 --python 3.5.5
옵션은 가상환경에 사용하고자 하는 특정 python 버전을 기입하여 설치하고자 할 경우에 입력하게 되며, Pipfile의 requires 세션안에 있는 python 버전을 무시하고 설치될 수 있다.pipenv 가상환경 설치 경로
PIPENV_VENV_IN_PROJECT=true 설정을 하지 않을 경우 아래 경로로 가상환경이 생성된다.
/Users/{user name}/.local/share/virtualenvs/{activated folder name}-6kKOUVMa/bin/activate
github - https://github.com/pyenv/pyenv-virtualenv
Pyenv-virtualenv란? - pyenv와 연동하여 격리된 환경에서 특정 python interpreter와 package들을 관리할 수 있도록 도와주는 도구
설치
brew install pyenv-virtualenv
사용방법
pyenv virtualenv {파이썬 버전} {환경이름}
pyenv uninstall {환경명}
pyenv local {환경이름}
참고
python distribution에 대해 설명해 놓은 블로그
Anaconda Python limitationsBecause Anaconda includes so many useful libraries, and can install even more with only a few keystrokes, the size of an Anaconda installation can be much larger than CPython. A basic CPython installation runs about 100MB; Anaconda installations can grow to gigabytes in size. This can be an issue in situations where you have resource constraints.One way to reduce Anaconda’s footprint is to install Miniconda, a stripped-down version of Anaconda that includes only the absolute minimum of pieces needed to get up and running. You can then add packages to Miniconda as you see fit, with an eye toward how much space each piece consumes.
https://python-guide-kr.readthedocs.io/ko/latest/starting/which-python.html
python interpreter 종류에 대해서 알기 쉽게 설명해 놓았다.
인터프리터설명CPython가장 널리 사용되는 “기본” 인터프리터로, 32비트 및 64비트 버전으로 사용 가능합니다(32비트 권장). 최신 언어 기능, 최대 Python 패키지 호환성, 완전한 디버깅 지원 및 IPython과 상호 interop을 포함합니다. 참고 항목: Python 2 또는 Python 3을 사용해야 하나요?. Visual Studio 2015 이전 버전은 Python 3.6+를 지원하지 않으며 Python 버전 3.6이 지원되지 않음과 같은 오류를 표시할 수 있습니다. 대신 Python 3.5 또는 이전을 사용합니다.IronPythonPython의 .NET 구현으로, 32비트 및 64비트 버전으로 사용 가능하며 C#/F#/Visual Basic interop, .NET API에 대한 액세스, 표준 Python 디버깅(그러나 C++ 혼합 모드 디버깅은 제외) 및 혼합 IronPython/C# 디버깅을 제공합니다. 하지만 IronPython에서는 가상 환경을 지원하지 않습니다.AnacondaPython에서 제공하는 개방형 데이터 과학 플랫폼으로, 최신 버전의 CPython과 설치하기 어려운 대부분의 패키지를 포함합니다. 달리 결정할 수 없는 경우 권장됩니다.PyPyPython의 고성능 추적 JIT 구현으로, 장기적으로 실행되는 프로그램과 성능 문제를 확인했으나 다른 해결 방법을 찾을 수 없는 상황에 적절합니다. Visual Studio에서 작동하지만 고급 디버깅 기능은 제한적으로 지원됩니다.JythonJVM(Java Virtual Machine)에서 Python 구현. IronPython과 마찬가지로, Jython에서 실행되는 코드는 Java 클래스 및 라이브러리와 상호 작용할 수 있지만 CPython용으로 작성된 많은 라이브러리는 사용할 수 없습니다. Visual Studio에서 작동하지만 고급 디버깅 기능은 제한적으로 지원됩니다.
pyenv와 pipenv를 활용해 실제 가상환경을 구성하는 예제를 잘 설명해 놓은 블로그