簡體   English   中英

何時在setup.py中使用pip requirements文件與install_requires?

[英]When to use pip requirements file versus install_requires in setup.py?

我正在使用帶有virtualenv的pip來打包和安裝一些Python庫。

我想我正在做的是一個很常見的場景。 我是幾個庫的維護者,我可以明確地指定依賴項。 我的一些庫依賴於第三方庫,這些庫具有我無法控制的傳遞依賴性。

我想要實現的是在我的一個庫上pip install來下載/安裝它的所有上游依賴項。 我在pip文檔中遇到的問題是, 需求文件是否/如何自行完成,或者它們實際上只是對使用install_requires的補充。

我是否會在所有庫中使用install_requires來指定依賴項和版本范圍,然后僅使用需求文件來解決沖突和/或凍結它們以進行生產構建?

讓我假裝我生活在一個虛構的世界(我知道,我知道),我的上游依賴是直截了當的,保證永遠不會沖突或破壞向后兼容性。 我是否會被迫使用pip需求文件或者只是讓pip / setuptools / distribute根據install_requires安裝所有內容?

這里有很多類似的問題,但我找不到任何與使用其中一個或者和諧地使用它們一樣基本的問題。

我的理念是install_requires應該指出你需要的最小值。 如果您知道某些版本不起作用,它可能包括版本要求; 但它不應該有你不確定的版本要求(例如,你不確定未來的依賴版本是否會破壞你的庫)。

要求在另一方面文件應說明你知道什么的工作,可能包括你推薦可選的依賴。 例如,您可以使用SQLAlchemy但建議MySQL,因此將MySQLdb放在需求文件中)。

總而言之: install_requires是讓人們遠離那些你知道不起作用的東西,而需求文件引導人們走向你認識的事情。 其中一個原因是始終檢查install_requires要求,並且在未實際更改包元數據的情況下無法禁用。 所以你不能輕易嘗試新的組合。 只在安裝時檢查需求文件。

這是我在setup.py中添加的內容:

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

setup(
    .....
    install_requires=REQUIREMENTS
)

“Python包裝用戶指南”有一個關於此主題的頁面,我強烈建議您閱讀它:

摘要:

install_requires用於列出必須安裝的軟件包的依賴項才能使軟件包正常工作。 它並不是要將依賴項固定到特定版本,而是接受范圍,例如install_requires=['django>=1.8'] pip install name-on-pypi和其他工具可以觀察到install_requires

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查看。

我只使用setup.pyinstall_requires因為只有一個地方可以查看。 它與擁有需求文件一樣強大,並且沒有重復維護。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM