파이썬에서 환경을 설정할 때 패키지를 설치하고 실행하게 된다. 

깃허브에 릴리즈된 수많은 오픈소스들을 봐도 보통 특정 프로젝트(코드)를 실행하기 위한 환경에 대한 정보가 제공되거나 requirements.txt가 함께 제공되는 것을 확인할 수 있다.

http://github.com/clovaai/deep-text-recognition-benchmark

 

requirements.txt 란?

python 프로젝트 파일(.py)이 실행되는 데 필요한 패키지 정보들이 담긴 문서로, 다른 가상환경이나 다른 파이썬 환경에서 python 종속성을 따라 똑같은 환경을 구성할 수 있도록 도움을 준다. 이름을 꼭 requirements.txt로 네이밍할 필요는 없지만 대다수의 프로젝트에서 파이썬 패키지 리스트를 저장하는 파일을 requirements.txt 로 사용하고 있어 암묵적인 약속(?)의 네이밍이라고 생각하면 편하다.

import datetime.datetime as dt
import pytz

tz = pytz.timezone('Asia/Seoul')
date_now = dt.now(tz)
print(date_now)

위와 같은 간단한 코드를 실행하려고 해도 datetime/pytz 패키지가 설치되어있지 않거나, 혹은 둘 다 설치되어있다고 해도 두 패키지의 의존성이 맞지 않으면 실행되지 않을 수 있기 때문에 패키지의 수가 많아질수록 서로 의존성을 해치지 않는지를 확인해야 한다. 

보통 가상환경을 통해 테스트하거나, 프로젝트별 가상환경을 따로 만들어서 실행하는 것이 일반적이다.

 

이 때, 주의해야 할 것이 conda 와 pip 를 혼동하지 않는 것이다. conda로 가상환경을 만들어서 사용하는 사람이라면 혼동하는 실수를 할 수도 있다. 둘 다 python 패키지를 관리하는 도구이지만 몇가지 차이점이 있다.

Conda

- python 뿐만 아니라 다양한 언어 (C, C++ 등)의 패키지를 관리할 수 있는 통합 패키지관리자로, 환경을 관리하고 패키지 의존성을 해결하는 데 특화되어 있다.

- 미리 컴파일된 바이너리 패키지를 사용하여 설치/업데이트/삭제를 수행하므로 컴파일 과정이 필요없다.

Pip

- 주로 python 패키지를 설치하고 관리하는 데 사용된다. PyPI(Python Package Index)에서 패키지를 가져와 설치한다. 

- 패키지를 소스코드로부터 설치하므로 해당 패키지에 필요한 컴파일러 및 의존성이 필요할 수 있다.

 

conda 패키지의 버전 정보 확인 : anaconda 사이트

 

python 패키지의 버전 정보 확인 : pypi 사이트

같은 패키지명이라도 각자 다른 버전을 제공하는 것을 확인할 수 있다.

 

주의!! Conda와 pip는 각자의 패키지 관리 및 의존성 해결 전략을 가지고 있기 때문에, Conda에서 pip로 변환할 때 몇 가지 주의사항이 있다.

일반적으로 pip 명령어로 requirements.txt를 추출할 때

pip freeze > requirements.txt

 

위의 명령어를 사용하게 되는데, pip로 install 했다면 정상적으로 보였을 내용들이,

 

conda를 사용하여 패키지를 설치했다면 아래와 같은 상황이 발생할 수 있다.

이런 에러가 발생하는 이유는 conda로 설치한 패키지를 pip를 이용하여 freeze 하려고 했기 때문에 경로에 대한 내용이 기재되어 출력되는 현상이 발생하는 것이다. conda용 requirements.txt 커맨드는 따로 존재한다.

conda list -e > requirements.txt

 

 

위의 커맨드를 실행하면 

2번 이미지

위와 같은 형태로 다시 requirements.txt가 다르게 생성이 되는 것을 확인할 수 있다. 그러나 위의 커맨드를 사용한 requirements.txt의 내용은 뒤에 요상한 형태의 내용들이 붙어있는 것을 볼 수 있다. 이는 conda로 부터 붙어오는 

이 내용을 pip requirements.txt로 변환하고 싶다면

pip list --format=freeze > requirements.txt

로 변환이 가능하다. 다만 주의해야할 것은 이대로 install하게되면 conda<>pip 간의 다른 패키지 관리 시스템으로 dependecy issue/error가 발생할 수 있다.

 

만약 2번 이미지의 requirements.txt 을 리눅스 환경 내의 콘다에서 사용하고 싶다면, 

가상환경을 activate 한 다음 아래의 커맨드를 입력하면 정상적으로 환경이 설치되는 것을 확인할 수 있다.

conda install --file requirements.txt

 

그 외에, pip 명령을 사용하여 conda의 버전을 설치하고 싶다면, 

pip install --no-deps -r requirements.txt

 

pip이 의존성을 자동으로 해결하지 않도록 설정하여 설치할 수 있다.

 

가장 간단한 방법은 conda를 사용하여 파일에 명시된 패키지들을 직접 설치하는 것이다.

conda create -n <environment_name>  -f requirements.txt

 

경우에 따라 pip와 conda를 함께 사용하여 패키지를 설치해야할 수있는데, conda로 관리되는 패키지와 pip로 관리되는 패키지가 공존할 수 있다.

# Conda로 관리되는 패키지 설치
conda install --file requirements_conda.txt

# Pip으로 관리되는 패키지 설치
pip install -r requirements_pip.txt

 

만약 pip install 하기 위한 패키지명이 필요하다면 requirements.txt의 디렉토리로 접속한 뒤 정규식을 통해 pip-requirements.txt로 추출할 수 있다.

sed -En 's/^([a-zA-Z0-9\-]+)=([0-9\.]+)=.*/\1==\2/p' requirements.txt > pip-requirements.txt

 

conda 커맨드를 사용하여 추출한 requirements.txt와 conda 커맨드 > 정규표현식으로 추출한 pip-requirements.txt의 내용을 비교하면 아래와 같이 다른 것을 확인할 수 있다.

 

반대로 pip freeze로 추출한 requirements.txt를 conda 환경에서 인스톨하는 경우라면 

conda install pip
pip install -r requirements.txt

위의 커맨드를 사용하여 설치할 수 있다.


나의 경우는 아래와 같은 방법을 사용하여 해결할 수 있었다.

1. 우선, pip freeze 커맨드로 requirements 뽑기

pip freeze > requirements.txt

2. 위의 커맨드로 뽑은 requirements는 일부 라인 끝에 @로 시작하는 내용이 붙어있기 때문에 제거한다. sed 명령어와 정규표현식을 활용해서 수정하기

sed -i.bak '/@/d' requirements.txt

3. 수정한 내용의 requirements를 설치하기

pip install -r requirements.txt

 

이러한 접근 방식들을 사용하여 conda에서 pip로 환경을 전환하며 최소한의 의존성 충돌을 유지할 수 있을 것이다.

 

레퍼런스 참고 : 사이트

+ Recent posts