python개발환경 세팅

석헌주·2021년 12월 13일
0

python 개발환경을 구성하기에 앞서

먼저 python 개발환경을 구성하는데 있어서 왜 virtualenv를 사용하게 되는지에 대한 이유를 잘 정리한 블로그가 있어 스크랩 했습니다. 한번 읽어보시면 감을 잡는데 도움을 받을 수 있을 것 같습니다.

python 가상환경을 사용하는 이유

정리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는 서로 트레이드 오프가 있기 때문에 같이 사용한다면 범용적으로 사용할 수 있습니다.

예를 들면

  1. miniconda를 설치하고 필요한 python 버전을 설치 한 다음에
  2. pipenv를 활용해 프로젝트 디렉터리에 격리된 개발환경을 구성합니다.

일반 적인 경우 이렇게만 하면 필요한 파이썬 개발환경 구성은 완료됩니다.

만약 conda에서만 설치할 수 있는 패키지들이 필요하다면 conda를 설치한 후, pipenv 환경을 구축 할 때 --python={path}옵션과 --site-package 옵션을 설정해서 conda에서 install한 package들을 사용할 수 있도록 구성합니다. 이렇게 사용 할 경우 conda를 통해 설치한 package들은 배포시 다른 설치방법이 필요 할 수도 있기 때문에 Pipfile에서는 제외 할 수 있도록 합니다.

결론

  • 필요한 파이썬 인터프리터는 pyenv를 통해 받거나 conda를 통해 받는다.
  • pipenv를 통해 프로젝트 마다 독립적인 환경을 구축해서 사용한다.
  • conda package가 필요 할 경우 system에 conda를 설치하거나 pyenv를 통해 conda를 설치한 후에 pipenv 에서 python path 설정과 site packages 옵션을 통해 conda 라이브러리를 사용할 수 있도록 설정해 준다.

각각의 설치 방법과 간단한 활용 방법은 아래에서 확인할 수 있습니다.

zsh, oh-my-zsh 설치

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를 사용한다.

Pyenv

github - https://github.com/pyenv/pyenv

pyenv command reference - https://github.com/pyenv/pyenv/blob/master/COMMANDS.md

pyenv란? - 파이썬 버전을 관리해 주는 툴

설치방법

  • macOS
    • brew update
    • brew install pyenv
    • shell 설정 .zshrc
      • shell 설정파일 가장 아래쪽에 다음 내용 입력
        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
    • 제대로 동작하기 위해선 다음 명령어도 추가로 입력해 줘야 한다 (mac os 기준) - 출처 https://github.com/pyenv/pyenv/wiki/Common-build-problems
      • brew install readline xz
      • sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
  • linux
    • 다음 명령어 실행 curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
    • shell 설정 파일 가장 아래쪽에 다음 내용 기입
    • 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 설치경로 확인

  • /usr/local/var/pyenv/
  • linux의 경우 home 디렉터리 안에 .pyenv 폴더가 생성된다.

pyenv를 통해 설치된 파이썬 확인 경로

  • /usr/local/var/pyenv/versions/
  • 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를 통해 설치한 python versions은 3.5.5와 3.6.5 이렇게 두 가지가 있다.
  • 그 아래에 있는 dbtool-v4, for_global….등등의 것들은 virtualenv를 활용해 만든 가상환경(pip package도 함께 관리 할 수 있는…)
  • pyenv 를 활용하여 시스템에 깔려있는 python을 건드리지 않고 여러가지 환경의 python interpreter를 독립적으로 사용할 수 있다. 즉 프로젝트별로 필요한 각각의 python interpreter를 손쉽게 바꿔가며 사용 할 수 있다.

간단한 사용방법

  • 도움말
    • pyenv help
  • 설치할 수 있는 python version 및 종류 확인
    • pyenv install -list
  • 사용하고 싶은 python 설치
    • pyenv install {python version}
  • 설치한 python 종류 확인 및, 현재 적용된 파이썬 확인
    • pyenv versions
    • python --version 명령어를 통해서는 현재 사용하고 있는 python 인터프리터 버전을 확인 할 수 있다.
  • system 전체 레벨에서 사용할 파이썬 선택
    • pyenv global {python version}
  • 특정 repository에서 사용 할 python 선택
    1. 사용하고자 하는 폴더로 이동
    2. pyenv local {python version (or 가상환경 이름)}
  • local로 설정 된 가상환경 해제
    • 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

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

  • 터미널에서 아래 명령어로 설치 스크립트 다운로드 (macos용)
    • wget https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh -O ~/miniconda.sh
  • 다음 명령어로 설치 스크립트 실행
    • bash ~/miniconda.sh -b -p $HOME/miniconda
    • -p 옵션 이후에 원하는 설치 디렉터리를 설정 할 수 있으나 기본적으로 홈 디렉터리로 지정
    • 이렇게 설치를 완료하면 홈 디렉터리 안에 miniconda 디렉터리가 생성된 것을 확인할 수 있다. 제대로 설치 되었 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
  • 자신이 사용하는 쉘 설정파일 안에 아래 내용을 가장 아랫쪽에 기입한다. (zsh을 설치 했다면 ~/.zshrc)
    • export PATH="$HOME/miniconda/bin:$PATH"
  • source 명령어를 통해 쉘 설정파일을 한번 실행시켜주거나 터미널 재실행
    • source ~/.zshrc
  • terminal 에서 conda --version 설치된 conda version을 확인할 수 있다.

간단한 conda 사용법

  • 사용할 수 있는 conda 기반 가상환경 리스트 확인
    • conda env list
  • 가상환경 생성
    • conda create --name {myenv} python=3.6
  • 현재 쉘 환경에 콘다로 만든 가상환경 로드 및 해제
    • conda 버전이 4.6 이하 일 경우 가상환경을 activate 하기 전에 source activate 명령어로 가상 환경을 한번 load해 줘야 한다. 이런식으로 한번 로드 한 이후에는 conda activate, conda deactivate명령어를 통해 가상환경을 로드하거나 해제 할 수 있다. 터미널 종료 후에는 이러한 과정이 모두 리셋 되기 때문에 다시 source activate 명령어를 입력해야만 한다. 번거로움을 피하기 위해 그냥 source activate 명령어를 사용할 수도 있다.
    • source activate {myenv} (혹은 conda activate {myenv})
    • source deactivate (혹은 conda deactivate)
  • 현재 환경에 설치된 package list 확인
    • conda list - pip로 설치한 패키지를 포함한 모든 패키지를 나열해 준다. (conda 명령어가 아닌 pip명령어로 설치한 패키지더라도 list에서 보여준다.)
    • pip list - pip로 설치한 리스트를 보여준다. (가상환경 안에서 사용한다면 pip는 가상환경 안에서 설치된 리스트를 보여주게 되고 conda list는 가상환경과는 별개의 conda 환경에서 설치된 리스트를 보여주게 된다.)
  • conda를 활용해서 package 설치
    • conda install {pacakge_name}

Pipenv

공식문서 - https://pipenv.readthedocs.io/en/latest/

github - https://github.com/pypa/pipenv

  • github에 적혀있는 pipenv 자랑
    • You no longer need to use pip and virtualenv separately. They work together.
    • Managing a requirements.txt file can be problematic, so Pipenv uses the upcoming Pipfile and Pipfile.lockinstead, which is superior for basic use cases.
    • Hashes are used everywhere, always. Security. Automatically expose security vulnerabilities.
    • Give you insight into your dependency graph (e.g. $ pipenv graph).
    • Streamline development workflow by loading .env files.
  • pyenv에 대한 한글 소개내용
  • pipenv는 기본적으로 시스템에 설치되어 있는 가상환경을 가져온다. 예를들어 시스템에 깔려있는 파이썬이 2.x 버전일 경우 pipenv --three 명령어로 python3 버전의 가상환경을 설치하려 할 경우 3버전은 사용할 수 없다. 따라서 가상환경에서 사용할 파이썬 버전이 필요한 경우 pyenv install 3.5.5와 같이 pyenv를 통해 필요한 python version을 설치 한 후 pipenv를 활용해 독립된 가상환경을 사용한다.
  • pipenv를 활용하여 프로젝트 root폴더 아래에 .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
    • PIPENV_VENV_IN_PROJECT=true 로 설정하면 실행 폴더 안에 .venv라는 이름으로 가상환경 파일이 생성된다.
    • PIPENV_IGNORE_VIRTUALENVS=1 설정은 특정 가상환경 안에서 pipenv 가상환경을 생성 할 경우 기존 가상환경에 설치된 패키지들을 그대로 가져오게 되는데 그러한 상황을 방지하면서 독립적인 가상환경을 만들어 주기 위한 설정
    • --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

Pyenv-virtualenv

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를 활용해 실제 가상환경을 구성하는 예제를 잘 설명해 놓은 블로그

간단한 conda command 사용법

Why python devs should use pipenv

pipenv –site-package option

profile
백엔드 개발자

0개의 댓글