문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 Python (문단 편집) === 패키지 관리 === * PyPI Python의 공식 패키지 저장소로, Python package index의 줄임말이다. 2012년 Python 소프트웨어 재단에 의해 구축되었다.[* Python의 라이브러리 개발 방식은 세월이 흐름에 따라 여러 차례 바뀌었다. 패키지 관리자라는 개념이 없어서 각자 프로그램의 소스 코드를 다운로드해 쓰던 시절에는 '''setup.py'''라는 설치 스크립트를 각자 만들어서 Python 프로그램과 함께 배포하는 것이 관행이었다. 복잡한 설치 스크립트가 필요한 이유는 여러 OS 간의 호환성 문제를 해결하기 위함도 있지만, C와 C++ 코드를 함께 사용한 라이브러리를 배포하기 위함이다. 이러한 언어는 해당 OS에 맞게 컴파일해야 하는데, 수많은 OS에 맞춰 컴파일하는 것은 문제가 있었다. 이를 언어 차원에서 지원하기 위해 Python 1.6부터는 [[https://docs.python.org/3/distutils/|distutils]]라는 빌드 도구를 기본 탑재하였다. 그런데 distutils는 자신의 프로그램이 필요로 하는 다른 패키지를 설치하지 못한다는 치명적인 문제가 있었다. 가령 내가 만든 패키지 A가 B에 의존하고, B는 C에 의존할 경우, 예전에는 사용자가 A, B, C를 일일이 설치해야 했다. 이를 해결하기 위해 [[https://setuptools.readthedocs.io/|setuptools]]라는 도구가 등장하였다. 그리고 시대가 지나고 세월이 흘러 pip이라는 패키지 관리자와 PyPI라는 패키지 저장소가 등장하면서, setup.py를 만드는 기존의 방식의 단점이 부각되었다.[* setup.py를 실행하는 데 필요한 도구[* setuptools나 설치에 필요한 다른 기능. 또한 C/C++ 코드를 사용하는 경우에는 해당 시스템에 C/C++ 컴파일러도 설치되어 있어야 한다.]가 있는지 확인하고, 없으면 자동으로 설치하거나 사용자에게 알려주는 기능이 없다. setup.py는 Python 코드로 작성하기 때문에 패키지 이름이나 버전과 같은 메타데이터를 추출하는 것이 까다롭다. setup.py에는 아무 Python 코드나 넣을 수 있으므로 악의적인 코드를 심을 수 있다. setup.py는 setuptools를 직접 import하기 때문에 사용자가 다른 빌드 도구를 선택할 수 없다.] 이 때문에 setup.py를 작성하는 대신 pyproject.toml[* [[npm]]이 사용하는 package.json과 유사하지만, [[https://en.wikipedia.org/wiki/TOML|TOML]]이라는 파일 형식을 사용한다.]이라는 설정 파일을 사용하는 표준안인 [[https://www.python.org/dev/peps/pep-0518/|PEP-518]]이 등장하였다. pip는 버전 10.0부터 pyproject.toml을 지원했다.] 2021년 11월 기준 34만여 개의 패키지를 제공한다.[* PyPI가 Python을 개발하는 재단에 의해 만들어져 운영되고 있는 공식 저장소이기는 하지만 최초의 Python 패키지 저장소는 아니다.] 아래와 같이 Python 패키지를 간단히 설치할 수 있다. 기본적으로 패키지를 모두 한곳에 설치하기 때문에 시스템에 내장된 Python에 영향을 주며, 프로젝트를 여러 개 관리할 경우 호환성 문제가 생긴다. 따라서 virtualenv와 같이 가상 환경을 다루는 도구와 함께 사용하는 것이 좋다. {{{#!syntax sh pip install package }}} * [[아나콘다(파이썬/R)|Anaconda]] 사설 패키지 저장소 겸 가상환경 관리 프로그램으로, 공학/과학 응용 분야에서 매우 널리 사용되며 일반 사용자에게는 무료이다. [* 2020년부터 정부 및 200인 이상 기업에게는 유료로 바뀌었다.] `conda`라는 명령줄 프로그램을 제공하며, 이는 별도의 가상환경 생성 및 관리 기능을 가지고 있고 같은 명령어로 해당 가상환경에 패키지를 설치할 수 있다. Python 패키지만 지원하는 PyPI와 달리 blas, cuda, boost 등의 패키지 또한 등록되어 있어 anaconda에서 관리하는 가상환경에 설치할 수 있다. 편리하고 공식적인 PyPI를 사용하지 왜 굳이 이런 사설 패키지 저장소를 사용하냐고 궁금해할 수도 있는데, 이는 의존성(Dependency) 관리 때문이다. PyPI는 의존성 충족 여부를 단순히 패키지별로 확인하며, 두 패키지의 의존성이 충돌되는 경우를 막아주지 않는다. 그러나 conda의 경우 의존성 트리를 철저하게 확인하여 그러한 의존성 모순이 없도록 강제한다. 따라서 의존성 관계가 복잡한 경우 conda를 사용하여 관리하는 것이 편리하다. 또한 상술한 바와 같이 python 패키지 외의 다른 언어로 작성된 패키지도 설치가 가능하며[* libjpg, bzip 등 시스템에서 자주 사용되는 패키지 다수가 포함됨], 이들 또한 위의 의존성 관리에 포함된다. 따라서 시스템에 설치되어 있는 패키지의 버전이 설치하고자 하는 라이브러리와 호환되지 않거나, 보안상의 이유로 시스템에 패키지를 추가 설치하기 어려운 경우 사용할 수 있다. [* 물론 필요에 따라 직접 빌드해서 설치하면 당연히 사용할 수 있지만, 매우 귀찮고 번거로우며 기술적 지식을 요구하므로...] 이와 같은 이유로 의존성이 복잡한 몇몇 패키지들은 anaconda를 사용하여 설치하는 것을 권장하는 경우가 있다. 수학/과학/공학 업무에 필요한 NumPy, SciPy, Jupyter Notebook 등의 수백 개의 패키지와 도구를 한 번에 깔아줄 뿐만 아니라 GUI도 제공하는 Anaconda와, 코어 기능인 패키지 매니저 및 가상환경 관리자만을 제공하는 Miniconda가 있다. 다만 Anaconda는 설치에 시간이 오래 걸리고, 어차피 몇백 개나 되는 패키지를 다 쓸 일은 잘 없기 때문에 Conda 사용에 숙련되면 Miniconda를 쓰는 것도 좋다. Miniconda는 패키지를 자신이 직접 찾아서 깔아야 하지만, 어차피 필요한 패키지를 설치하는 것은 {{{#conda install <패키지명>}}} 몇 번만 두드려 보면 간단히 해결된다. {{{#!syntax sh conda install package }}} 각종 Python 라이브러리를 설치하고 관리하는 도구이다. 몇몇 Python 라이브러리는 리눅스의 패키지 관리자로도 설치할 수 있지만, 이는 시스템의 Python을 건드리므로 일반적으로는 권장되지 않는다. 쓸데없는 라이브러리들이 함께 설치되거나 패키지 의존 관계가 꼬이는 것을 막으려면 하나의 패키지 관리자만 이용하는 것이 좋다. 단, Conda에는 등록되지 않아서 PyPI으로만 설치할 수 있는 패키지는 어쩔 수 없이 PyPI을 사용해야 한다. 그리고 PyPI로 설치할 수 없는 시스템 의존성(Dependency)이 있으면 Conda로 설치해야 한다. 리눅스와 같이 자체적으로 Python을 탑재한 운영체제에서는 호환성 문제를 특히 신경 써야 한다. 시스템에 내장된 핵심 도구들이 기본적으로 설치된 Python 라이브러리를 사용하기 때문이다. 만약 패키지를 설치하다가 호환성 문제가 생기면 최악의 경우 OS를 재설치해야 할 수 있다. 따라서 이런 OS에서는 시스템 내장 Python에 패키지를 설치하면 안 되며, 대신 {{{#pip install --user}}}로 사용자별 기본 환경에 설치하거나 별도의 가상 환경을 만들어야 한다. 이렇게 Python으로 개발한 SW를 공개 배포하는 경우 소스 코드가 그대로 노출된다. 사실 이 부분은 오픈소스 생태계에서 아주 유리하게 작용했는데, 누군가 만들다 중단된 프로젝트를 포크(Fork)해서 프로젝트를 이어가거나 기존 코드를 들여다보고서 그 패키지에 대한 확장 기능을 어렵지 않게 개발할 수 있었기 때문이다. 코드에 대한 버그 신고나 커밋, 피드백도 Python 생태계의 발전을 견인한 한 축이었다. 상용 프로그램을 개발하거나 보안을 유지해야 하는 경우 Python 코드를 숨기는 것이 불가능하지는 않다. 가장 쉬운 방법은 byte code인 pyc파일로 변환하는 방법이다. 하지만, 이 방법은 조금만 노력하면 디컴파일이 쉽게 되기 때문에 코드를 숨길 수 없고 다만 코드 보기를 조금 어렵게 만드는 것으로 이해해야 한다. Pyc 파일보다 나은 방법은 PyInstaller를 사용하는 방법이다. PyInstaller는 Py 파일을 종속성을 분석해서 필요한 shared lib를 하나에 폴더에 패키징하고, EXE나 ELF의 실행 파일을 생성하여 소스 코드를 숨길 수 있다. PyInstaller로 패키징하는 과정에서 --key 옵션을 사용하면 AES256 으로 Bytecode를 암호화한다. 다만 이는 Python 자체 기능이 아니라 제3자 솔루션이라는 한계가 있다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기