파이썬 패키지에 requirements.txt 추가 및 dependency 해결해 주기

Jay
7 min readFeb 14, 2019

--

일단 들어가기 앞서 깃허브 주소를 수정 가능하다는 걸 깨닫고, PyPI 도 ypcc, git주소도 ypcc로 통일.(20190214)

이번 내용은 주제와 많이 다르고 산으로 간다고 느끼실 수 도 있습니다. 하지만 글 작성 목적 자체가 정보공유에 있다기 보다 제 기억저장소의 역할이 더 크기 때문에 양해 부탁드립니다

패키지의 라이브러리 의존성 (dependency)

파이썬에서 라이브러리 인스톨은 참 중요하다.

예를들어 아래와 같은 단순한 코드를 실행하려고 해도

내 작업 환경에서 numpy 라이브러리가 설치되어 있지 않다면, 이렇게 된다.

no module named ‘numpy’

가령 위의 array.py 라는 내 코드가 배포된경우 제대로 작동하려면 배포된 컴퓨터에서 numpy가 설치가 되어있어야만 하는데 그렇지 않은 경우 그 사용자에게

너의 환경에서 numpy 라이브러리가 설치되어 있지 않으니 설치해줄께

라고 알려주는 것, 그게 목적이다.

그럼 내 패키지 배포시에 의존성 문제를 해결해 주려면?

  1. 분명 내가 현재 개발한 이 코드는 잘 돌아가고 있으므로,
    내 패키지의 워킹 환경을 알아내야한다.
  2. 워킹 환경을 사용자가 패키지를 설치할 때 반영되어야한다.

1. 워킹환경 알아내기

일단 위의 코드가 돌아가도록 conda install numpy를 해주었다.

이후 실행하면

성공적을 실행 된다.

이 가상환경 ypcc 의 라이브러리 구성요소를 확인하려면

pip freeze
numpy 가 포함되어있는 모습

이 정보를 알고있으면 다른사용자가 내 라이브러리를 사용할때 저 정보를 이용해서 환경을 구축 할 수 있다. python 커뮤니티에서 저것을 공유하는 방식은 바로 requirments.txt 파일을 이용하는 것.

pip freeze > requirements.txt
내 패키지 위치에서 위 명령어를 이용해서 requirements.txt 파일을 추가
requirments.txt 안에 그대로 반영이 되었다.

이대로 깃허브에 업데이트 하면 github에서 requirements.txt를 이용해서 직접 구축할 수 도 있다.

requirements.txt를 이용한 환경구축 방법?

위 파일을 이용해서 새로운 가상환경을 구축해보자.

conda create -n test_env python=3.6
activate test_env
pip install -r requirements.txt

아니 여기서 문제가 발생…

mkl-fft를 못찾는다고?

찾아보니까

pip 의 경우 1.0.6이 최신버전
conda 에서는 이것이 1.0.10으로 높은버전이다.
  • 이러한 에러가 발생한 이유는 크게보면 condapip 을 혼용해서 사용한 것 때문이다.
  • 그러나 좀더 세부적으로 살펴보면, mkl-fft fast furier transform 라이브러리이기 때문에, 위에서 conda install numpynumpy를 깔았을때 업데이트가 되었을 것으로 보인다.
빙고

아니 무슨 numpy하나 install 하는데 이렇게 많은걸 깔아댄거야.

그래서 env_test 로 다시 가상환경을 만들고 이번에는 pip install numpy 로 인스톨을 해보았다.

그랬더니 mkl 종류가 모두 사라짐

그럼 certifiwincertstore는 도대체 무슨용도인지 찾아보았는데, certifi는 네트워크 보안을 담당하는 것같고 wincertstore는 윈도우에서 작동하는 보안을 담당하는 것 같다. 즉 공통적으로 cert보안을 책임진다는 것. 이는 아나콘다에서 conda environment를 이용할 때, conda install 을 보안을 적용하여 설치하게 하는 것일까?

이때 문득 든 생각이, 그렇다면 python기본제공 virtual environment를 이용하면 어떤 라이브러리들이 설치가 될까?

Virtual env 이용한 가상환경

python -m venv myenv
myenv\scripts\activate
pip freeze
pip list

놀랍게도 pip freeze의 경우 아무것도 print 되지 않았고

pip list의 경우

Package    Version
---------- -------
pip 10.0.1
setuptools 39.0.1

이렇게 나왔다.

다시말하면, 내가 사용을 하기 위한 가상환경 개발은 conda 로 만들어도 상관없지만, 패키지 개발을 위한 가상환경은 venv를 사용 사용하는 것이 최적화에 좋을 것이라는것!

더욱 인상깊은 것은 따로 지우는 명령 없이, venv로 만든 그 폴더를 지우기만해도 가상환경이 사라진다는것.

일단 패키지를 만들때 venv를 사용하는 것에 대한 좋은 설명을 찾아서 링크를 첨부한다.

mkl_fft의 정체, 그리고 인텔

오늘 새로운 것을 알게 되었다. 바로 Intel Distribution for Python 이라는 것인데, 인텔에서 파이썬을 위해 개발한 연산속도 향상 패키지이다. 모든 파이썬이 아니라 특정 라이브러리, 구체적으로 이야기하면 데이터사이언스를 위한 패키지, numpy, scipy, 머신러닝 등을 다룰 때에 연산속도를 향상시켜주 패키지 인데, 이 안에 mkl_fft 라는 녀석이 있었던거지. 그리고 아나콘다의conda install numpy 는 디폴트로 intel-numpy 를 깔았던 것이기 때문이고, 이 Intel 패키지는 mkl_fft을 이용하여 연산속도를 향상시킨다(Fast Furier Transform라이브러리?) 따라서 mkl_fft=1.0.10 intel-numpydependency가 되는것이고, 이것이 깔린 것이지. 그런데 이걸 pip install -r requirements.txt를 하게되면 PyPI에서 mkl_fft를 찾게되는데 여기서 문제가 발생한 결정적인 이유는PyPI에 있는 최신버전이 mkl_fft = 1.0.6버전이기 때문이었던 것이다.

(PyPI)mkl-fft = 1.0.6
(Conda)mkl-fft = 1.0.10

그래서 requirements.txt의 실패원인은 바로 콘다환경에서 설치한 numpy때문이었다는것.

References

setup.py와 requirements.txt의 차이점과 사용 방법
Reference requirements.txt for the install_requires kwarg in setuptools setup.py file
Specifying Dependencies

How to install packages using pip according to the requirements.txt file from a local directory?
파이썬 프로젝트 시작하기 — Virtualenv

--

--

Jay
Jay

Written by Jay

Brain Neural Network : Where neuroscience meets machine learning

No responses yet