6

subprocess32에 의존하는 라이브러리 (subx)가 있습니다. subprocess32 라이브러리는 Python2.7의 백 포트이며 타임 아웃 kwarg를 제공합니다.종속성 관리 : Python2.7에 필요한 subprocess32

내 라이브러리에 시간 초과가 필요합니다.

대상 플랫폼이 Python2.x 인 경우에만 subprocess32가 필요합니다.

내 프로젝트에서 종속성을 어떻게 정의해야합니까? ,

===> pip install -e git+https://github.com/guettli/subx.git#egg=subx 
Obtaining subx from git+https://github.com/guettli/subx.git#egg=subx 
    Cloning https://github.com/guettli/subx.git to ./src/subx 
Collecting subprocess32 (from subx) 
    Using cached subprocess32-3.2.7.tar.gz 
    Complete output from command python setup.py egg_info: 
    This backport is for Python 2.x only. 

    ---------------------------------------- 
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-lju3nl1y/subprocess32/ 

답변

6

은 선언적인 방법이있다 : 나는 "install_requires"(setup.py)를 통해 subprocess32에 대한 종속성을 정의하면

나는,이 오류 메시지와 나는 python3의 VIRTUALENV 내부입니다 그러나 afaik 그것을 더 많거나 적게 setuptools의 버전이 필요합니다 (내가 정확히 release notes을 읽으면, 적어도 20.2 버전이 필요합니다). 아래에서 볼 수있는 것은 환경 마커라고 불리며 PEP 508으로 지정되어 있습니다. 사용 가능한 마커의 전체 목록과 원하는 경우 마커 구문을 더 잘 이해하기 위해 읽습니다.

파이썬 버전의 경우 패키지를 예로 들어 보겠습니다. subprocess32 종속성이 있으므로 python2.X 환경에 설치해야합니다. 이처럼 의존성을 강화 :

install_requires=[ 
    'subprocess32; python_version<"3"', 
] 

python2.7와 패키지 subx를 설치하면 현재 산출 : 당신이 python3.X와 함께 설치하는 경우

Processing ./dist/subx-2017.8.0-py2-none-any.whl 
Collecting subprocess32; python_version < "3" (from subx==2017.8.0) 
Installing collected packages: subprocess32, subx 
Successfully installed subprocess32-3.2.7 subx-2017.8.0 

는, 출력은 다음과 같습니다

Processing ./dist/subx-2017.8.0-py3-none-any.whl 
Installing collected packages: subx 
Successfully installed subx-2017.8.0 

공지 사항을 그 subprocess32의 설치는 건너 뜁니다.


또 다른 일반적인 예는 플랫폼 별 종속성을 선언하는 것입니다 : 나는 맥 OS에서 리눅스에 설치하는 auditwheeldelocate을 필요로하는 프로젝트가 있습니다. 나는이 같은 종속성을 선언

install_requires=[ 
    ... 
    'auditwheel==1.7.0; "linux" in sys_platform', 
    'delocate==0.7.1; "darwin" == sys_platform', 
] 

참고 특별히 주요 파이썬 버전을 대상으로하지 않는 경우 리눅스에 대해이 검사가 필요하다는 이유는 너무

$ python2 -c "import sys; print sys.platform" 
linux2 

하지만

$ python3 -c "import sys; print sys.platform" 
linux 

예를 들어 패키지가 python2.X으로 만 작동하는 경우 "linux2" == sys.platform 체크를 사용할 수 있습니다. 이렇게하면 종속성은 python2.X으로 만 설치 가능합니다.

+0

이것은 완전한 대답 인 것 같습니다. 그러나,'sys.platform' 윈도우는 Windows의 경우'win32'를, Windows/Cygwin의 경우'cygwin'을 출력합니다. –

+0

@ElisByberi afaik 기본 표현식이 지원되므로' "win32"== sys_platform 또는 "cygwin"== sys_platform'이 작동해야합니다. 그러나'platform_system'과 같은 다른 환경 마커가 있습니다.이 환경 마커는이 경우에 더 적합 할 것입니다. 다시 한 번 [PEP 508] (https://www.python.org/dev/peps/pep-0508/#environment-markers)에서 자세한 내용을 확인하십시오. – hoefling

5
import sys 

kw = {} 
if sys.version_info[0] == 2: 
    kw['install_requires'] = ['subprocess32'] 

setup(
    … 
    **kw 
) 
+3

코드 작동 방식에 대한 설명을 추가하는 것이 좋습니다. 단순히 코드를 제공하는 것이 프로그래밍 학습에 가장 좋은 방법은 아니며 설명이 잘 된 경우 게시물 제작자에게 많은 도움이되지 않습니다. 상세한 답변을 통해 지역 사회에서의 신뢰가 형성되며 귀하의 답변에 따라 투표가 이루어질 것입니다. –

+0

예, 작동합니다.그러나 더 많은 선언적 솔루션이 있는지 스스로에게 묻습니다. 이것은 프로그래밍과 같아서 종속성을 정의하지 않는 것처럼 보입니다. 나를 오해하지 마라. 답변 주셔서 감사합니다! – guettli

+0

이 접근법은 원본 tars에서만 작동하지만 바퀴로는 실패합니다. – hoefling