더 이상 종속성이없는 소스로 라이브러리로 파이썬 응용 프로그램을 배포하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/527510

문제

배경: 저는 회사의 소프트웨어를 조금 더 쉽게 발표하는 개발자를위한 Life를 생명으로 만드는 작은 Python 응용 프로그램이 있습니다. py2exe를 사용하여 Windows 용 실행 파일을 빌드합니다. 이진뿐만 아니라 응용 프로그램은 전복으로 체크됩니다. 분포는 SVN에서 디렉토리를 확인하는 사람들이 발생합니다. 이 프로그램에는 약 6 개의 다른 Python 라이브러리 종속성이 있습니다 (예 : ElementTree, Mako)

그 상황: 개발자는이 도구의 소스를 해킹 한 다음 바이너리를 만들지 않고도 실행하려고합니다. 현재 이것은 Python 2.6 통역사 (괜찮습니다)가 필요하고 Easy_install을 사용하여 로컬로 6 개의 라이브러리를 설치해야 함을 의미합니다.

문제

  • 이것은 공개적이고 고전적인 오픈 소스 환경이 아닙니다. 저는 기업 네트워크 내부에 있습니다.이 도구는 "벽으로 된 정원"을 떠나지 않을 것이며 외부 인터넷 (NTLM을 인증하지 않은 프록시 및/또는 기계를 인증하는 데 있어서는 매우 불편한 장벽을 가지고 있습니다. 직접 인터넷 액세스).
  • 나는이 도구를 최소화하기 위해 장애물이 최소화되기를 원합니다. 올바른 버전에서 올바른 종속성을 찾을 필요는 없습니다. 가능한 한 적은 설정을 실행해야합니다. 최적의 전제 조건은 Python 설치를하고 Subversion에서 프로그램을 확인하는 것입니다.

일화: 과정이 자연적으로 포함할수록 더 쉽게 반복 할 수 있습니다. 나는 내 기계를 새로 교체했고, 종속성을 리버스 엔지니어링하고, Distutils를 다시 설치하고, 온라인으로 라이브러리를 사냥하고 설치하도록하는 불쾌한 과정을 거쳤습니다 (위의 회사 인터넷 제한 참조).

도움이 되었습니까?

해결책

나는 때때로 @boris가 말하는 것과 똑같은 이유와 같은 이유로 아래에 설명하는 접근법을 사용합니다. 일부 코드를 사용하는 것이 a) SVN 체크 아웃/업데이트 -B) 이동만큼 쉽습니다.

그러나 기록을 위해 :

  • 대부분의 경우 virtualenv/easy_install을 사용합니다.
  • 나는 @ali a와 @s.lott의 비판에 어느 정도 동의합니다.

어쨌든, 내가 사용하는 접근법은 sys.path 수정에 따라 다르며 다음과 같이 작동합니다.

  • 소프트웨어를 사용할 모든 컴퓨터에서 Python 및 Setupools (계란에서 코드로드를 활성화)가 필요합니다.
  • 디렉토리 구조를 구성하십시오.
project/
    *.py
    scriptcustomize.py
    file.pth

    thirdparty/
        eggs/
            mako-vNNN.egg
            ... .egg
        code/
            elementtree\
                *.py
            ...
  • 최상위 스크립트에는 상단에 다음 코드가 포함되어 있습니다.
from scriptcustomize import apply_pth_files
apply_pth_files(__file__)
  • 프로젝트 폴더에 ScriptCustomize.py를 추가하십시오.
import os
from glob import glob
import fileinput
import sys

def apply_pth_files(scriptfilename, at_beginning=False):
    """At the top of your script:
    from scriptcustomize import apply_pth_files
    apply_pth_files(__file__)

    """
    directory = os.path.dirname(scriptfilename)
    files = glob(os.path.join(directory, '*.pth'))
    if not files:
        return
    for line in fileinput.input(files):
        line = line.strip()
        if line and line[0] != '#':
            path = os.path.join(directory, line)
            if at_beginning:
                sys.path.insert(0, path)
            else:
                sys.path.append(path)
  • 프로젝트 폴더에 하나 이상의 *.pth 파일을 추가하십시오. 각 줄에 패키지가있는 디렉토리에 대한 참조를 넣으십시오. 예를 들어:
# contents of *.pth file
thirdparty/code
thirdparty/eggs/mako-vNNN.egg
  • 나는이 접근법처럼 "종류". 내가 좋아하는 것 : *.pth 파일의 작동 방식과 유사하지만 전체 사이트 패키지 대신 개별 프로그램의 경우. 내가 좋아하지 않는 것 : 최상위 스크립트의 시작 부분에서 두 줄을 추가해야합니다.
  • 다시 : 나는 대부분의 경우 Virtualenv를 사용합니다. 그러나 배포 시나리오를 엄격하게 제어 할 수있는 프로젝트에 VirtualEnV를 사용하는 경향이 있습니다. 제어가 엄격하지 않은 경우 위에서 설명한 접근 방식을 사용하는 경향이 있습니다. 프로젝트를 지퍼로 패키지하고 최종 사용자가 "설치"를 "설치"하게합니다.

다른 팁

그냥 사용하십시오 virtualenv - 분리 된 파이썬 환경을 만들 수있는 도구입니다. 원하는 경우 설정 스크립트를 만들고 전체 무리를 배포 할 수 있습니다.

"나는 개발자 (또는 깨끗한 새 기계에서 시작하는)가 시작하기 전에 라이브러리를 로컬로 설치 해야하는 Distutils 후프를 뛰어 넘어야한다는 사실을 싫어합니다."

왜요?

구체적으로 무엇이 잘못 되었습니까?

당신은 프로젝트를 만들기 위해 그것을했습니다. 귀하의 프로젝트는 다른 사람들이 똑같이하고 싶어하는 인기가 있습니다.

문제가 보이지 않습니다. 해결해야 할 특정 문제로 질문을 업데이트하십시오. 오픈 소스가 배포되는 방식을 싫어하는 것은 문제가되지 않습니다. 오픈 소스가 작동하는 방식입니다.

편집하다. "벽으로 된 정원"은 그다지 중요하지 않습니다.

선택 1. BTW, Easy_Install을 6 번 실행하는 "설치 프로그램"을 빌드 할 수 있습니다.

선택 2. Easy_Install에서 사용했던 모든 설치 프로그램 키트를 저장할 수 있습니다. 그런 다음 압축을 해제하는 스크립트를 제공 할 수 있습니다. python setup.py install 6 명 모두.

선택 3. 당신은 당신의 지핑 버전을 제공 할 수 있습니다. site-packages. Python을 설치 한 후에는 사이트 패키지 디렉토리를`c : python2.5 lib site-packages``````Giip을 삽입니다.

선택 4. 파이썬 환경을위한 고유 한 MSI 설치 프로그램 키트를 구축 할 수 있습니다.

선택 5. 자신의 PYPI와 같은 서버를 호스팅하고 서버를 먼저 확인하는 Easy_Install을 제공 할 수 있습니다.

Nosklo와 S.Lott의 답변에 동의합니다. (둘 다 +1)

당신이하고 싶은 것은 실제로 끔찍한 아이디어.

사람들이 진정으로 코드를 해킹하기를 원한다면 관련된 라이브러리, 작동 방식, 어디에서 왔는지, 어디에서 왔는지, 각각의 문서 등에 대한 이해가 필요합니다. 당신은 그들이 단서가 없다는 시점까지 몰리 코딩 될 것입니다.

그런 다음 "한 사용자가 다른 버전을 설치하거나 라이브러리의 구현을 원한다면 어떻게해야합니까?"와 같은 특정 문제가 있습니다. 여기에 눈부신 예는 여러 구현이 있으므로 요소 트리입니다.

나는 이것이 좋은 생각이라고 제안하지는 않지만, 일반적으로 이와 같은 상황에서 내가하는 일은 내가 makefile을 가지고 있으며, 모든 종속 라이브러리를 가져오고 설치하는 규칙을 포함하는 Makefile을 가지고 있다는 것입니다. MakeFile은 종속 라이브러리가 존재하지 않는 경우에만 적용 할 수있을 정도로 똑똑 할 수 있으므로 비교적 빠를 수 있습니다.

프로젝트의 새로운 개발자는 단순히 Subversion에서 체크 아웃 한 다음 "Make"를 입력합니다.

이 접근 방식은 청중이 이미 페치 프로세스의 일부로 전복 체크 아웃을 사용한다는 아이디어에 익숙하다는 점을 감안할 때 귀하에게 적합 할 수 있습니다. 또한 외부 종속성을 포함하여 프로그램에 대한 모든 지식이 소스 코드 저장소에 캡처되는 멋진 속성을 가지고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top