일단 들어가기 앞서 깃허브 주소를 수정 가능하다는 걸 깨닫고, PyPI 도 ypcc, git주소도 ypcc로 통일.(20190214)
이번 내용은 주제와 많이 다르고 산으로 간다고 느끼실 수 도 있습니다. 하지만 글 작성 목적 자체가 정보공유에 있다기 보다 제 기억저장소의 역할이 더 크기 때문에 양해 부탁드립니다
패키지의 라이브러리 의존성 (dependency)
파이썬에서 라이브러리 인스톨은 참 중요하다.
예를들어 아래와 같은 단순한 코드를 실행하려고 해도
내 작업 환경에서 numpy
라이브러리가 설치되어 있지 않다면, 이렇게 된다.
가령 위의 array.py
라는 내 코드가 배포된경우 제대로 작동하려면 배포된 컴퓨터에서 numpy
가 설치가 되어있어야만 하는데 그렇지 않은 경우 그 사용자에게
너의 환경에서
numpy
라이브러리가 설치되어 있지 않으니 설치해줄께
라고 알려주는 것, 그게 목적이다.
그럼 내 패키지 배포시에 의존성 문제를 해결해 주려면?
- 분명 내가 현재 개발한 이 코드는 잘 돌아가고 있으므로,
내 패키지의 워킹 환경을 알아내야한다. - 그 워킹 환경을 사용자가 패키지를 설치할 때 반영되어야한다.
1. 워킹환경 알아내기
일단 위의 코드가 돌아가도록 conda install numpy
를 해주었다.
이후 실행하면
이 가상환경 ypcc
의 라이브러리 구성요소를 확인하려면
pip freeze
이 정보를 알고있으면 다른사용자가 내 라이브러리를 사용할때 저 정보를 이용해서 환경을 구축 할 수 있다. python 커뮤니티에서 저것을 공유하는 방식은 바로 requirments.txt 파일을 이용하는 것.
pip freeze > requirements.txt
이대로 깃허브에 업데이트 하면 github에서 requirements.txt를 이용해서 직접 구축할 수 도 있다.
requirements.txt를 이용한 환경구축 방법?
위 파일을 이용해서 새로운 가상환경을 구축해보자.
conda create -n test_env python=3.6
activate test_env
pip install -r requirements.txt
아니 여기서 문제가 발생…
찾아보니까
- 이러한 에러가 발생한 이유는 크게보면
conda
와pip
을 혼용해서 사용한 것 때문이다. - 그러나 좀더 세부적으로 살펴보면,
mkl-fft
는fast furier transform
라이브러리이기 때문에, 위에서conda install numpy
로numpy
를 깔았을때 업데이트가 되었을 것으로 보인다.
아니 무슨 numpy하나 install 하는데 이렇게 많은걸 깔아댄거야.
그래서 env_test
로 다시 가상환경을 만들고 이번에는 pip install numpy
로 인스톨을 해보았다.
그럼 certifi
와 wincertstore
는 도대체 무슨용도인지 찾아보았는데, 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-numpy
의 dependency
가 되는것이고, 이것이 깔린 것이지. 그런데 이걸 pip install -r requirements.txt
를 하게되면 PyPI에서 mkl_fft를 찾게되는데 여기서 문제가 발생한 결정적인 이유는PyPI
에 있는 최신버전이 mkl_fft = 1.0.6
버전이기 때문이었던 것이다.
그래서 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