Python 개발환경 설정의 문제점

  • 대부분의 프로그래밍 언어들은 자체적으로 패키지 관리 도구(package manager)를 제공하고 있습니다. 자바의 Maven, 자바스크립트의 npm처럼 파이썬에서는 pip라는 매우 간단한 패키지 관리 도구가 있는데요. 다른 언어의 패키지 매니저와 비교했을 때 부족한 부분들이 많다고 느끼실 겁니다.
  • 일단 기본적으로 패키지 설치가 전역으로(global) 설치되기 때문에 한 컴퓨터 상에서 여러 파이썬 프로젝트에 걸쳐 작업을 하기가 힘들다.
  • 프로젝트 별로 설치가 필요한 패키지를 정의하는 방식도 어디는 requirements.txt를 사용하고, 다른데는 setup.py를 사용하는 등 표준화가 모호한 부분이 있습니다.

 

pip란?
python을 이용하며 사용하게 되는 패키지 관리 툴이다.
  • 프로그램을 만들 때, 의도하지 않는 이상, 다양한 패키지를 사용하게 된다.
  • 이때 pip를 활용하여 여러가지 패키지들을 설치할 수 있다.

virtualenv란?
virtualenv는 프로젝트별로 고립된 개발환경을 구축하게 해주기 때문에 A 프로젝트와 B 프로젝트를 따로 의식하면서 패키지를 특정 환경에 맞게 설치했다 지웠다 하지 않으며 개발할 수 있게 된다.
  • 가령 A라는 프로젝트는 특정 패키지의 1.0 버전을 사용하고 있었지만, B라는 프로젝트는 특정 패키지의 2.0버전을 사용하는 경우가 발생한다.
  • 이때 각각의 프로젝트를 빌드하기 위해서 서로 번갈아가며 패키지를 설치했다 지웠다하는 생각은 버리도록 하자.

virtualenv 설치 및 사용법 (Mac 기준)

virtualenv 설치

$ pip3 install virtualenv


virtualenv에 파이썬 버전을 지정한다.

$ virtualenv venv --python=python3.7 


가상환경 생성. 일반적으로는 작업하고자 하는 프로젝트 디렉토리 내에서 생성하지만, 꼭 그 안에서 생성시킬 필요는 없다. 

$ virtualenv venv


가상환경을 활성화(activate)한다.

$ source venv/bin/activate 


가상환경을 활성화하게 되면, 가상환경 이름(이번 예에서는 venv)이 앞에 들어가는 것을 볼 수 있다. 

그러나 이건 bash 쉘 기준이고, 다른 shell에서는 어떻게 나오는지 모르겠다. 

그리고 pip list를 통해 설치된 패키지 리스트를 확인할 수 있다. 

만약에 프로젝트에 필요한 패키지를 설치하려면, 원래 파이썬 패키지를 설치할 때와 동일하게 pip install [패키지명]으로 설치하면 된다. 

그러면 설치된 패키지가 앞서 생성한 가상환경(venv)내에 설치된다.

(venv) $ pip list

 

requirements.txt란?
pip를 하나씩 설치를 하자니 시간이 많이 들게 된다.
그래서 requirements.txt라는 파일을 통해 통으로 패키지들을 관리할 수 있도록 지원하고 있다.
  • 문제점은 requirements.txt를 버전을 명시하지 않고 작성하였을때, 오늘과 내일의 설치가 똑같다는 보장이 없으며 정확히 버전을 일일이 기재를 하자니 또한 귀찮아진다. 

pipenv란?
python 개발 환경 구축의 번거로움을 줄이기 위해, pip와 virtualenv가 합쳐진 것이다.
pipenv는 파이썬에서도 패키지를 프로젝트 단위로 관리를 할 수 있도록 도와주는 고급 패키지 관리 도구입니다. 기본적으로 pip를 기반으로 동작하지만, 프로젝트 별로 격리된 가상 환경(virtual environment)과 프로젝트 단위의 패키지 관리 매커니즘을 제공합니다.
  • Pipenv를 설치하면 pip와 virtualenv를 따로 쓸 필요가 없이 pipenv 명령어로 해결이 가능하다.
  • Pipenv의 경우, Pipfile와 Pipfile.lock을 requirements.txt를 대신하여 사용한다.
  • Pipenv의 경우, Pipfile을 찾으면서 자동으로 프로젝트 홈을 찾아준다.
  • Pipenv의 경우, Pipfile이 없다면 자동으로 생성해준다.
  • Pipenv의 경우, 자동으로 virtualenv 환경을 생성한다.
  • Pipenv의 경우, 락이 걸린 의존성에 대해 해쉬 파일을 자동 생성하고 확인한다.(보안)
  • 자동으로 .env 파일을 인식하여 .env 파일들을 사용한 스트림라인 개발 워크플로우를 지원해준다.
  • pyenv가 사용 가능하다면, 필요한 python도 자동으로 설치한다.
  • 패키지를 설치/삭제하면, 자동으로 Pipfile에서 추가/삭제한다.
  • 필요한 것만 정의하면서, 파일에 정의된대로 빌드가 가능하다.
  • 의존성 그래프를 제공함으로서 insight를 제공한다 (e.g. $ pipenv graph).

pipenv 설치 및 사용법

해당 명령어를 terminal에 입력하여 설치하며, brew가 Mac에 설치되어 있지 않은 경우 신규 설치 후 호출한다.

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

# Mac 사용자라면 Homebrew를 통해 간편하게 pipenv를 터미널 상에서 설치할 수 있습니다.
$ brew install pipenv
# python & pip가 로컬에 설치되어 있는 경우 아래의 방법으로도 설치 가능하다.
# Mac을 사용하지 않는 분들은, pip을 이용해서 전역으로 설치해서 사용하면 됩니다.
$ pip3 install pipenv 

해당 명령어를 치면 python 3.6버전을 기준으로 한 프로젝트가 생성된다.

  • 폴더 생성 후, 아래 명령어를 치면 해당 파이썬 환경을 가진 가상환경이 생성되고, 프로젝트 디렉터리에 Pipfile이 생성된다.
  • 이 Pipfile 파일이 Node.js의 package.json 또는 자바의 pom.xml처럼 프로젝트의 메타 정보가 저장됩니다.
# 로컬에 파이썬2가 적용되어 있는데, 파이썬3(3.7)으로 변경하고 싶으면 아래와 같이 입력한다. 
$ pipenv --python 3.7

pipenv를 사용하여 기존 패키지들을 pip처럼 설치하는 것 뿐이다.

$ pipenv install [패키지명]
$ pipenv install # Pipfile이 있는 경우, 해당 파일에 명시된 모든 패키지 파일을 프로젝트 가상환경 내 설치

프로젝트 가상환경을 활성화 시킨다.

  • 가상 환경이 없을 경우, 새로 가상 환경을 생성 후,  가상환경 내 파이썬 shell을 실행시켜 준다.
  • 가상 환경을 비활성화하려면 exit 명령어만 날려주면 된다.
  • 가상 환경에서 빠져나오면 다시 원래대로 운영체제의 기본 파이썬 인터프리터를 사용하게 된다.
$ pipenv shell
$ (가상환경명)[가상환경에 설치된 python interpreter에서 작업 수행]
$ exit
or
$ pipenv run [가상환경에 설치된 python interpreter에서 실행할 명령어]
# 프로젝트의 셋업된 파이썬 인터프리터는 pipenv run 커맨드를 이용해서 간단하게 실행할 수 있습니다.

프로젝트 가상환경이 사용 중인 파이썬 파일 위치를 확인할 수 있다.
(옵션값을 주어서, 보통 프로젝트 폴더 내에 가상환경과 관련된 설치파일들이 설치되도록 하는 것이 일반적이다.)

$ pipenv --py     # pipenv가 사용중인 python 파일 위치
$ pipenv --venv # pipenv가 생성한 가상환경 위치
$ which python # which 커맨드를 통해 어떤 파이썬 인터프리터가 사용되는지 확인보면 가상 환경의 파이썬이 사용되고 있음을 알 수 있습니다.

어떠한 연유로, 관련된 가상환경을 제거하기를 원하는 경우, 아래의 명령어를 통해 제거 가능하다.

$ pipenv --rm
$ pipenv
Usage: pipenv [OPTIONS] COMMAND [ARGS]...

Options:
  --where          Output project home information.
  --venv           Output virtualenv information.
  --py             Output Python interpreter information.
  --envs           Output Environment Variable options.
  --rm             Remove the virtualenv.
  --bare           Minimal output.
  --completion     Output completion (to be eval'd).
  --man            Display manpage.
  --three / --two  Use Python 3/2 when creating virtualenv.
  --python TEXT    Specify which version of Python virtualenv should use.
  --site-packages  Enable site-packages for the virtualenv.
  --version        Show the version and exit.
  -h, --help       Show this message and exit.

Usage Examples:
   Create a new project using Python 3.6, specifically:
   $ pipenv --python 3.6

   Install all dependencies for a project (including dev):
   $ pipenv install --dev
   
   Install a local setup.py into your virtual environment/Pipfile:
   $ pipenv install -e .

   Create a lockfile containing pre-releases:
   $ pipenv lock --pre

   Show a graph of your installed dependencies:
   $ pipenv graph

   Check your installed dependencies for security vulnerabilities:
   $ pipenv check

   Use a lower-level pip command:
   $ pipenv run pip freeze

Commands:
  check   : 보안 취약점이 있는 패키지가 설치되어 있는지도 간단하게 체크가 가능
  clean   : Pipfile.lock에 명시되지 않은 모든 패키지를 삭제한다.
  graph  :  현재 설치된 모든 패키지의 의존성 그래프를 표시한다.
  install  [패키지명] : 해당 패키지를 설치하고, Pipfile에 추가한다. 패키지명이 없을 경우, Pipfile에 명시된 패키지를 모두 설치한다.
  lock       : Pipfile.lock을 생성시킨다.
  open  [모듈명] : editor에서 주어진 모듈을 보여준다. 
  run   [명령어] : virtualenv 상에서, 해당 명령어를 수행시킨다. 
  shell      : virtualenv 안에 있는 shell을 실행시킨다.
  sync      : Pipfile.lock에 명시된 모든 패키지를 설치한다.
  uninstall  [패키지명] : Pipfile에서 해당 패키지를 제거한다.
  • virutualenv와 pipenv는, 둘 다 파이썬 패키지 관리 툴로써, 사실상 기능이 거의 동일하다.
  • 가상환경을 만들고, 그 가상환경을 활성화(activate)시키는 과정이 virtualenv에 비해, pipenv가 더 간결하다.
  • 그리고, pipenv에서는, 파이썬의 requirements.txt와 같이, 적용한 패키지들을 쉽게 재적용할 수 있도록 만들어주는 문서파일(Pipfile)이 자동으로 만들어져서, 별도로 내가 만드는 노력이 없어도 된다.
  • Pipenv을 사용하면 애플리케이션 실행에 필요한 일단 패키지와 개발에만 필요한 패키지를 명확히 구분해서 설치할 수 있습니다.
  • 예를 들어, 단위 테스트를 할 때만 사용되는 pytest 패키지의 경우 다음과 같이 --dev 옵션을 줘서 개발 의존성(dev dependency)으로 설치할 수 있습니다.(개발용 패키지 설치)
    ex) pipenv install pytest --dev
Pipfile 이란?
Node.js & npm의 packages.json 처럼 패키지 설치 도구인 pipenv프로젝트 내 의존성 패키지 목록을 관리하기 위해 생성하는 파일이다.
[[source]]
name = "pypi"
url = "
https://pypi.org/simple"
verify_ssl = true # 패키지 설치 ssl 검증 적용 여부, ssl 관련 오류 시 false로 변경하여 시도합니다.

[dev-packages]

[packages]

[requires]
python_version = "3.7" # [requires] 항목에 가상 환경을 생성할 때 지정했던 파이썬 버전이 명시되어 있음을 알 수 있습니다.
Pipfile.lock 이란?
이 파일은 pipenv가 설치된 패키지의 버전과 그 패키지가 의존하는 다른 패키지들의 정확한 버전을 기억하기 위해서 자체적으로 사용하는 파일입니다. pipenv는 Pipfile.lock이라는 패키지 잠금 파일을 사용해서 Pipfile 파일에 정확한 버전이 명시되어 있지않더라도 항상 동일한 버전의 패키지를 설치할 수 있도록 해줍니다.
  • 따라서 우리가 직접 수정할 일은 없으며, 수정해서도 안 됩니다.  
pyenv란?
pyenv의 역할은 하나의 OS에 여러 파이썬 버전이 필요할 때, 필요에 따라 local에 적용되는 파이썬 버전을 변경시켜주는 것이다. 그리고, 위에 작성했던 것처럼, virtualenv나 pipenv에도 파이썬 버전을 설정할 수 있다. 

 

  • 보통 virtualenv나 pipenv는 pyenv와 함께 쓰인다.
  • virtualenv나 pipenv의 경우, 원하는 파이썬 버전이 이미 로컬에 설치되어 있는 경우에만, 위와 같은 명령어로 적용할 수 있기 때문이다.
  • 만약 로컬에 3.7 버전이 설치되어 있는데, virtualenv나 pipenv 명령어를 이용해서 3.8 버전을 적용하고 싶으면 에러 메세지가 나온다.
  • pyenv는 만약에 원하는 버전의 파이썬이 로컬에 저장되어 있지 않더라도, pyenv install [파이썬 버전] 이라는 명령어를 통해 설치와 동시에 적용이 된다.

아래의 명령어를 통해 설치한다.

$ brew install pyenv

환경변수를 설정한다.

# ~/.zshrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"

pyenv 사용하기

# 설치 가능한 Python 버전
$ pyenv install --list

# 특정한 버전 Python 설치
$ pyenv install 3.9.0

# 특정한 버전 Python 삭제
$ pyenv uninstall 3.9.0

# 설치된 Python list
$ pyenv versions

# 해당 Python 버전을 기본으로 설정
$ pyenv global 3.9.0

 

# 출처 

- https://leesh90.github.io/environment/2021/04/03/python-install/

- https://velog.io/@shz0309/python

- https://alphahackerhan.tistory.com/27

- https://medium.com/@erish/python-pipenv-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-961b00d4f42f

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기