setup.py에서 pip 요구 사항 파일과 install_requires를 사용하는 경우는 언제입니까?


94

일부 Python 라이브러리를 패키징하고 설치하기 위해 virtualenv와 함께 pip를 사용하고 있습니다.

제가하는 일은 꽤 흔한 시나리오라고 생각합니다. 저는 종속성을 명시 적으로 지정할 수있는 여러 라이브러리의 관리자입니다. 내 라이브러리 중 일부는 내가 제어 할 수없는 전이 종속성이있는 타사 라이브러리에 의존합니다.

내가 달성하려는 pip install것은 내 라이브러리 중 하나에서 모든 업스트림 종속성을 다운로드 / 설치하는 것입니다. pip 문서에서 내가 고민하는 것은 요구 사항 파일 이 자체적으로이를 수행 할 수 있는지 또는 실제로 install_requires.

내가 사용하는 것이 install_requires충돌을 해결 및 / 또는 생산 빌드를 동결 의존성 및 버전 범위를 지정하기 위해 내 모든 라이브러리에서 다음 만 요구 파일을 사용할 수 있습니까?

내가 상상의 세계에 살고 있다고 가정 해 봅시다. (나는 알고 있습니다) 내 업스트림 종속성은 간단하며 결코 충돌하거나 이전 버전과의 호환성을 깨뜨리지 않습니다. pip 요구 사항 파일을 사용하거나 pip / setuptools / distribute가 기반으로 모든 것을 설치하도록해야 install_requires합니까?

여기에는 비슷한 질문이 많이 있지만 언제 둘 중 하나를 사용하거나 둘 다 조화롭게 사용하는 것만 큼 기본적인 질문을 찾을 수 없었습니다.


3
이것은 둘의 관계와 어떻게 통합되는지를 설명하는 아주 좋은 기사입니다.
Björn Pollex 2014

답변:


68

제 철학은 install_requires당신이 필요한 최소한의 것을 나타내야한다는 것입니다. 당신이 경우 버전 요구 사항을 포함 할 수 있습니다 알고있는 몇 가지 버전이 작동하지 않습니다; 하지만 확실하지 않은 버전 요구 사항은 없어야합니다 (예 : 종속성의 향후 릴리스가 라이브러리를 손상 시킬지 여부를 확신 할 수 없음).

반면 요구 사항 파일은 사용자가 알고있는 것이 작동 하는지 나타내야 하며 권장하는 선택적 종속성을 포함 할 수 있습니다. 예를 들어 SQLAlchemy를 사용하지만 MySQL을 제안하므로 요구 사항 파일에 MySQLdb를 넣을 수 있습니다.

요약하면, install_requires작동하지 않는 것을 아는 일로부터 사람들을 멀리하는 한편, 작동하는 것을 아는 것으로 사람들을 이끄는 요구 사항 파일입니다. 그 이유 중 하나는 install_requires요구 사항이 항상 확인되며 실제로 패키지 메타 데이터를 변경하지 않고는 비활성화 할 수 없기 때문입니다. 따라서 새로운 조합을 쉽게 시도 할 수 없습니다. 요구 사항 파일은 설치시에만 확인됩니다.


5
이것은 당신이 setup.py install_requires=deps를 미러링해야 함을 의미 requirements.txt합니까?
proppy

9
그러나 setup.py의 요구 사항과 요구 사항 파일을 모두 갖는 것은 위험합니다. 복제가 동기화되지 않도록 요청하기 때문입니다.
Sebastian Blask 2013

1
또한 실제로 어떻게 작업합니까? 확실히 작동하는 상태에 도달하기 위해 요구 사항 파일을 한 번 사용한다고 가정합니다. 그런 다음 pip를 사용하여 실제 패키지로 설치하십시오. -U요구 사항 파일의 종속성을 재정의 할 수 있으므로 사용할 수 없습니다 . 어떻게 업그레이드합니까?
Sebastian Blask 2013

1
이 답변은 응용 프로그램과 패키지에 동일하게 적용됩니까? 일부 도구 (패키지)에 의존하는 my-web-app (앱)을 상상해보십시오. 둘 다 요청 패키지에 의존합니다. 일부 도구에 특정 버전 또는 버전의 요청 범위를 고정하는 requirements.txt 파일이있는 경우, 충돌하는 버전 / 버전 범위를 지정했을 수있는 my-web-app에 잠재적 인 문제가 발생하는 것처럼 보입니다.
Reece 2014 년

2
패키지를 설치하는 유일한 방법이 있어야합니다. 따라서 다른 기여자를 혼동하지 않는 한 두 가지를 모두 갖는 것은 권장되지 않습니다.
Gewthen 2015-10-16

17

내 setup.py에 넣은 내용은 다음과 같습니다.

# this grabs the requirements from requirements.txt
REQUIREMENTS = [i.strip() for i in open("requirements.txt").readlines()]

setup(
    .....
    install_requires=REQUIREMENTS
)

20
요구 사항 파일에는 주석과 포함 사항이 포함될 수 있습니다. pip 파서를 사용해야합니다
Romain Hardouin 2013-06-10

1
네, 결국 댓글을 제거하기 위해 이것을 변경했습니다. pip 파서는 내 대답보다 좋아 보입니다.
rbp

7
포함 된 모든 파일이 이미 setup.py에있는 경우 요구 사항 파일을 사용하는 이유는 무엇입니까?
Sebastian Blask 2013

2
@RomainHardouin, 링크 된 답변에 대한 의견에서 언급했듯이 pip는 그런 식으로 사용되지 않습니다.
akaihola

1
예, 이것은 --extra-index-url요구 사항에 대한 비판 이 필요할 때까지 나를 위해 일 했고 이것이 내 얼굴에 폭발했습니다. 감사 @RomainHardouin
토미

11

Python 패키징 사용자 가이드에는이 주제에 대한 페이지가 있습니다. 읽어 보는 것이 좋습니다.

요약:

install_requires패키지가 작동하려면 반드시 설치해야하는 패키지의 종속성을 나열합니다. 종속성을 특정 버전에 고정하는 것은 아니지만 범위는 허용됩니다 (예 : install_requires=['django>=1.8']. 및 다른 도구에 install_requires의해 관찰됩니다 pip install name-on-pypi.

requirements.txt실행하도록 선택할 수있는 텍스트 파일 pip install -r requirements.txt입니다. 다음과 같이 모든 종속성 및 하위 종속성의 버전이 고정되어 django==1.8.1있습니다. 을 사용하여 만들 수 있습니다 pip freeze > requirements.txt. (일부 서비스는 Heroku가 같이 자동으로 실행 pip install -r requirements.txt당신을 위해.) pip install name-on-pypi보지 않고 requirements.txt단지에서 install_requires.


5

나는 오직 한 곳만 볼 수 있기 때문에 a setup.py와 만 사용합니다 install_requires. 요구 사항 파일이있는 것만 큼 강력하며 유지 관리 할 중복이 없습니다.


질문은 언제 둘 중 하나를 사용해야하는지, 철자를 쓰지 않았지만 내 대답은 항상 하나를 사용하고 다른 하나를 사용하지 않는다는 것입니다. 그게 어떻게 질문에 답하지 않습니까?
Sebastian Blask 2015 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.