何时在setup.py中使用pip requirements文件与install_requires?

Joe*_*way 85 python pip setuptools distribute setup.py

我正在使用带有virtualenv的pip来打包和安装一些Python库.

我想我正在做的是一个很常见的场景.我是几个库的维护者,我可以明确地指定依赖项.我的一些库依赖于第三方库,这些库具有我无法控制的传递依赖性.

我想要实现的是让pip install我的一个库下载/安装它的所有上游依赖项.我在pip文档中遇到的问题是,需求文件是否/如何自行完成,或者它们实际上只是对使用的补充install_requires.

我是否会install_requires在所有库中使用指定依赖项和版本范围,然后仅使用需求文件来解决冲突和/或冻结它们以进行生产构建?

让我们假装我生活在一个想象的世界(我知道,我知道),我的上游依赖是直截了当的,并保证永远不会冲突或破坏向后兼容性.我是否会被迫使用pip要求文件或者只是让pip/setuptools/distribute安装所有内容install_requires

这里有很多类似的问题,但我找不到任何与使用其中一个或者和谐地使用它们一样基本的问题.

Ian*_*ing 66

我的理念是,install_requires应该指出你需要的最低限度.如果您知道某些版本不起作用,它可能包括版本要求; 但它不应该有你不确定的版本要求(例如,你不确定未来的依赖版本是否会破坏你的库).

要求在另一方面文件应说明你知道什么的工作,可能包括你推荐可选的依赖.例如,您可以使用SQLAlchemy但建议MySQL,因此将MySQLdb放在需求文件中).

总而言之:install_requires是让人们远离那些你知道不起作用的东西,而要求文件引导人们走向你认识的事情.其中一个原因install_requires始终检查需求,并且在不实际更改包元数据的情况下无法禁用.所以你不能轻易尝试新的组合.只在安装时检查需求文件.

  • 在setup.py和require文件中同时具有这两个要求是危险的,因为复制只是要求变得不同步. (8认同)
  • 这是否意味着您应该在`requirements.txt`中镜像`setup.py``install_requires =`deps? (5认同)
  • 应该只有安装包的方法.因此,除非您想混淆其他贡献者,否则不建议同时使用这两者. (2认同)

rbp*_*rbp 14

这是我在setup.py中添加的内容:

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

setup(
    .....
    install_requires=REQUIREMENTS
)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,需求文件可能包含注释和包含.[你应该使用pip解析器](http://stackoverflow.com/questions/14399534/how-can-i-reference-requirements-txt-for-the-install-requires-kwarg-in-setuptool/16624700#16624700 ) (18认同)
  • 为什么要使用一个需求文件,如果它包含的所有文件都在setup.py中? (6认同)
  • @RomainHardouin,正如您对链接答案的评论中所提到的那样,pip并不意味着以这种方式使用. (2认同)

Fli*_*imm 9

"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.


Seb*_*ask 5

我只使用过一个setup.py,install_requires因为只有一个地方可以看.它与拥有需求文件一样强大,并且没有重复维护.