Development Tip

Python 모듈 종속성이있는 Python 소프트웨어를 쉽게 배포하는 방법은 무엇입니까?

yourdevel 2020. 12. 27. 20:12
반응형

Python 모듈 종속성이있는 Python 소프트웨어를 쉽게 배포하는 방법은 무엇입니까? Unix에서 Python 패키지 설치의 좌절


내 목표는 널리 사용되는 여러 Python 패키지를 종속성으로 포함하는 Python 패키지를 배포하는 것입니다. 내 패키지는 pandas, scipy 및 numpy와 같이 잘 작성된 Pypi 인덱싱 된 패키지에 의존하며 setup.py에서 특정 버전 이상이 필요함을 지정합니다 (예 : "numpy> = 1.5").

파이썬 패키징 전문가 아닌 (Python 작성 방법을 알고 있더라도) 유닉스에 정통한 사용자 가 사용하기 쉬운 패키지 관리자를 사용할 때에도 저와 같은 패키지를 설치하는 것은 매우 실망스럽고 거의 불가능하다는 것을 알게되었습니다. . 누군가가 제공 할 수있는이 고통스러운 프로세스에 대한 대안이 있는지, 아니면 내 경험이 Python 패키징 및 배포의 매우 어려운 현재 상태를 반영하는지 궁금합니다.

사용자가 패키지를 시스템에 다운로드한다고 가정합니다. 대부분은 다음과 같은 것을 사용하여 "순진하게"설치하려고합니다.

$ python setup.py install

Python 패키지 설치에 대한 Google 지침을 보면 일반적으로 이것이 나타납니다. 대부분의 사용자는 Unix / Linux 서버에 대한 루트 액세스 권한이 없기 때문에 대부분의 사용자에게는 실패합니다. 더 많은 검색을 통해 "--prefix"옵션을 발견하고 다음을 시도합니다.

$ python setup.py install --prefix=/some/local/dir

사용자가 파이썬 포장의 복잡한 인식하지 때문에, 그들에 대한 인수로 임의의 디렉토리를 선택합니다 --prefix"~/software/mypackage/". 다른 모든 Python 패키지가 상주하는 깔끔하게 선별 된 디렉토리는 아닙니다. 대부분의 사용자는 이러한 세부 정보를 인식하지 못하기 때문입니다. 다른 패키지 "myotherpackage"를 설치하면 통과 "~/software/myotherpackage"할 수 있으며 이로 인해 해킹 PYTHONPATH및 기타 복잡한 문제가 발생할 수 있습니다.

설치 프로세스를 계속 하면 종속성 중 하나 (예 : pandas, scipy 또는 numpy) 및 패키지가 누락되었을 수 있으므로 사용자가 패키지가 올바르게 설치된 것처럼 보였더라도 패키지를 사용하려고하면 "setup.py install"with 호출 "--prefix"도 실패합니다. 관리자는 사용되지 않습니다. 이러한 패키지를 개별적으로 설치하려고합니다. 성공하더라도 패키지는 PYTHONPATH비표준 디렉토리로 인해 필연적으로 존재하지 않으며 "--prefix"환자 사용자는 PYTHONPATH종속성을 표시하기 위해 수정 작업 을 수행합니다.

이 단계에서 사용자는 Python에 정통한 친구 "easy_install"로부터 소프트웨어를 설치하고 종속성을 처리하기 위해 메인 스트림 관리자 인와 같은 패키지 관리자를 사용해야한다고 말할 수 있습니다 . "easy_install"어려울 수있는을 설치 한 후 다음을 시도합니다.

$ easy_install setup.py 

사용자는 일반적으로 프로덕션 Unix 서버에 소프트웨어를 전역 적으로 설치할 권한이 없기 때문에 이것도 실패합니다. 더 많이 읽으면 "--user"옵션에 대해 배우고 다음을 시도합니다.

$ easy_install setup.py --user 

오류가 발생합니다.

usage: easy_install [options] requirement_or_url ...
   or: easy_install --help

error: option --user not recognized

그들은 옵션을 설명하는 온라인 페이지가 명확하게 easy_install있는 --user옵션 이없는 이유에 대해 매우 당황 할 것 입니다. 그들은 easy_install최신 버전 으로 업그레이드하려고 시도 했지만 여전히 실패 할 수 있습니다.

계속해서 Python 패키징 전문가와상의하면 두 가지 버전 이 있다는 것을 알게 될 것입니다. 두 가지 버전easy_install모두 easy_install"혼동을 최대화하기 위해 " 명명 되었지만"distribute "의 한 부분과"setuptools "의 다른 부분입니다. 단지 "easy_install""distribute"지원 "--user"및 서버의 대부분은 / SYS 관리자 설치 "setuptools"easy_install등 로컬 설치가. 가능 명심하지 않을 것이다 간의 이러한 차이 "distribute""setuptools"파이썬 패키지 관리 전문가 수없는 사람들을 위해 이해 의미하고 어렵다.

이 시점에서 나는 내 소프트웨어 패키지를 설치하려고하는 가장 단호하고 정통하며 참을성있는 사용자의 90 %를 잃었을 것입니다. 그들은 최첨단 Python 패키지 배포의 전문가가 아닌 Python으로 작성된 소프트웨어를 설치하고 싶었습니다. 이것은 너무 혼란스럽고 복잡합니다. 그들은 포기하고 낭비되는 시간에 좌절 할 것입니다.

계속해서 더 많은 Python 전문가를 요청하는 소수의 사용자는 pip/virtualenv대신 easy_install. 이러한 도구의 작동 방식과 기존 또는 호출 과의 차이점을 설치 pip하고 virtualenv파악하는 것은 그 자체로 시간이 많이 걸리고 어려우며, 간단한 Python 소프트웨어를 설치하고 사용하려는 사용자에게 다시 묻기에는 너무 많습니다. 어떤 여부가 설치 종속성으로도이 경로를 추구하는 사람들이 혼동 될 것 또는 여전히 사용할 수 있습니다 또는 모든 요구는 처음부터 다시 설치해야하는 경우."python setup.py""easy_install"easy_installsetup.py install --prefixpip/virtualenv

이 문제는 문제의 패키지 중 하나 이상이 기본값이 아닌 다른 버전의 Python을 설치하는 데 의존하는 경우 악화됩니다. Python 패키지 관리자가 원하는 Python 버전을 사용하고 있고 필요한 종속성이 Python 2.y가 아닌 관련 Python 2.x 디렉터리에 설치되어 있는지 확인하는 것이 어렵 기 때문에 사용자는 끝없이 실망 할 것입니다. 확실히 그 단계에서 포기할 것입니다.

사용자가 Python 패키지, 경로 및 위치에 대한 이러한 모든 기술적 세부 사항을 조사 할 필요가없는 Python 소프트웨어를 설치하는 더 간단한 방법이 있습니까? 예를 들어, 저는 Java를 많이 사용하지는 않지만 가끔 Java 도구를 사용하고 설치하는 Java 소프트웨어의 X 및 Y 종속성에 대해 걱정할 필요가 없었으며 Java 패키지가 어떻게 작동하는지 전혀 알 수 없습니다. 작업을 관리하지 않는다는 점에 기쁩니다. Java로 작성된 도구를 사용하고 싶었습니다. 제 기억은 Jar를 다운로드하면 바로 얻을 수 있고 작동하는 경향이 있다는 것입니다. .

파이썬에 상응하는 것이 있습니까? 이러한 모든 종속성과 버전을 추적해야하는 사용자에게 의존하지 않는 방식으로 소프트웨어를 배포하는 방법? 모든 관련 패키지를 다운로드하여 바이너리로 사용할 수있는 자체 포함 된 것으로 컴파일하는 방법이 있습니까?

이 좌절감은 유닉스 사용자에게 패키지를 배포한다는 좁은 목표에서도 발생한다는 점을 강조하고 싶습니다. 크로스 플랫폼 문제 등에 대해 걱정하지 않고 문제를 더 간단하게 만듭니다. 사용자가 유닉스에 정통하다고 가정하고 파이썬을 알고 있지만, 파이썬 패키징의 안과 밖과 다양한 패키지 관리자의 수많은 내부 합병증 / 경쟁에 대해 알지 못합니다 (알고 싶지 않습니다). 이 문제의 불안한 특징은 모든 Python 패키지 종속성이 Pandas, Scipy 및 Numpy와 같이 잘 알려져 있고 잘 작성되고 잘 유지 관리되는 Pypi 사용 가능 패키지 일 때도 발생한다는 것입니다. 제대로 형성된 패키지가 아닌 모호한 종속성에 의존하는 것과는 다릅니다. 오히려 많은 사람들이 의존 할 수있는 가장 주류 패키지를 사용하고있었습니다.

이에 대한 도움이나 조언을 주시면 대단히 감사하겠습니다. 파이썬은 훌륭한 라이브러리를 가진 훌륭한 언어라고 생각하지만, 사람들이 로컬로 설치하고 실행하기 쉬운 방식으로 내가 작성한 소프트웨어 (종속성이 있으면)를 배포하는 것이 사실상 불가능하다는 것을 알게되었습니다. 내가 작성중인 소프트웨어는 프로그래밍 방식으로 사용하기위한 Python 라이브러리가 아니라 사용자가 개별 프로그램으로 실행하는 실행 가능한 스크립트가있는 소프트웨어임을 명확히하고 싶습니다. 감사.


또한 numpy, scipy 및 기타 PyPI 패키지에 의존하는 소프트웨어 프로젝트를 개발합니다. 현재 원격 설치를 관리하는 데 사용할 수있는 최고의 도구는 zc.buildout 입니다. 이다 매우 사용하기 쉬운. 웹 사이트에서 부트 스트랩 스크립트를 다운로드하고 패키지와 함께 배포합니다. 일반적으로라는 "로컬 배포"파일을 작성 buildout.cfg하여 패키지를 로컬로 설치하는 방법을 설명합니다. bootstrap.py파일과 buildout.cfg패키지를 모두 제공합니다. MANIFEST.inPython 패키지에 있는 파일을 사용하여 PyPI에서 배포 한 zip 또는 tar 볼로이 두 파일을 강제로 삽입합니다. 사용자가 패키지를 풀 때 다음 두 명령을 실행해야합니다.

$ python bootstrap.py # this will download zc.buildout and setuptools
$ ./bin/buildout # this will build and **locally** install your package + deps

The package is compiled and all dependencies are installed locally, which means that the user installing your package doesn't even need root privileges, which is an added feature. The scripts are (normally) placed under ./bin, so the user can just execute them after that. zc.buildout uses setuptools for interaction with PyPI so everything you expect works out of the box.

You can extend zc.buildout quite easily if all that power is not enough - you create the so-called "recipes" that can help the user to create extra configuration files, download other stuff from the net or instantiate custom programs. zc.buildout website contains a video tutorial that explains in details how to use buildout and how to extend it. Our project Bob makes extensive use of buildout for distributing packages for scientific usage. If you would like, please visit the following page that contains detailed instructions for our developers on how they can setup their python packages so other people can build and install them locally using zc.buildout.


We're currently working to make it easier for users to get started installing Python software in a platform independent manner (in particular see https://python-packaging-user-guide.readthedocs.org/en/latest/future.html and http://www.python.org/dev/peps/pep-0453/)

For right now, the problem with two competing versions of easy_install has been resolved, with the competing fork "distribute" being merged backing into the setuptools main line of development.

The best currently available advice on cross-platform distribution and installation of Python software is captured here: https://packaging.python.org/

ReferenceURL : https://stackoverflow.com/questions/14665216/how-to-easily-distribute-python-software-that-has-python-module-dependencies-fr

반응형