2014-01-13 2 views
21

파이썬 2와 파이썬 3 모두에서 작동하는 모듈을 가지고 있습니다. 파이썬에서 < 3.2 특정 패키지를 의존성으로 설치하고 싶습니다. 파이썬> = 3.2. 같은python 버전을 기반으로 install_requires

뭔가 :

install_requires=[ 
    "threadpool >= 1.2.7 if python_version < 3.2.0", 
], 

이 어떻게 그렇게 할 수 있습니까?

+0

가능한 중복 https://stackoverflow.com/questions/6080646/install-requires-in-setup-py-depending-on- ([설치 파이썬 버전에 따라 setup.py에서 \ _requires 설치] installed-python-version) – ederag

답변

35

setuptoolsenvironment markers을 사용하여이를 지원합니다.

install_requires=[ 
    'enum34;python_version<"3.4"', 
    'pywin32 >= 1.0;platform_system=="Windows"' 
] 

이 내용은 official documentation에 자세히 설명되어 있습니다. change log을 기반으로 v20.5에 추가되었지만 구현은 v20.8.1 (15 일 간격 만) 때까지 안정적이지 않았습니다.


(여전히 유효하지만, 미래에 사용되지 수 있습니다) 원래 대답 :

setuptoolsextras_require 인수 내에서 사용이 지원합니다.

extras_require={ 
    ':python_version=="2.7"': ["mock"], 
}, 

그것은 다른 비교 연산자를 지원합니다 :

형식은 다음과 같다.


슬프게도, documentation에는 언급되어 있지 않습니다. 답변을 찾는 동안 PEP-426에서 "환경 마커"에 대해 이야기했습니다. 그 문구로 나는 다음과 같은 덧글을 가지고 setuptools ticket을 찾을 수있었습니다 :

나는 선택적이고 선언적으로 의존성을 요구하는 마커 기능을 성공적으로 사용했습니다. 예를 들어 backports.unittest_mock을 참조하십시오. '엑스트라'를 통해 mock이 필요하지만 Python 2에서만 가능합니다. Setuptools 17.1에 의존 할 수 있으면 해당 의존성을 python_version < "3.3"으로 변경할 수 있습니다. 의

+1

정답입니다. 이전 버전의 python (예 : 2.7.6)은'setuptools' 버전에서 해당 구문을 인식하지 못하기 때문에 오류가 발생합니다. 따라서 더 많은 호환성이 필요하다면 @iTayb에서 제안한 것과 같은 좀 더 호환성있는 버전을 사용하십시오. –

+1

"python_version"이전에 ":"을 사용하는 사람은 누구입니까? 그것은 어딘가에 문서화되어 있습니까? – AXO

+0

이 마커를 지원하는 가장 빠른 버전의 setuptools는 무엇입니까? – AXO

9

이 내용은 here으로, 을 사용하여 setup.py 내부의 Python 버전을 테스트하는 것이 좋습니다.

import sys 

if sys.version_info >= (3,2): 
    install_requires = ["threadpool >= 1.2.7"] 
else: 
    install_requires = ["threadpool >= 1.2.3"] 

setup(..., install_requires=install_requires) 
+4

이 솔루션은'pip'와'wheel' 패키지의 많은 조합으로 취약합니다. pip가 wheel을 대신하여 빌드 할 때, 계산 된 install_requires리스트는 휠 메타 데이터에 쓰여지고 캐시 된 휠은 다른 Python 버전에서 사용될 수 있습니다. –

관련 문제