我该如何生成requirements.txt? Pip Freeze不是一个好方法

时间:2015-05-21 03:22:14

标签: python-3.x pip

我应该如何为Python项目生成requirements.txt?

这是我遇到的pip冻结问题。假设我的包P需要A,B,C。假设C是一个导入X,Y,Z的库,但P只需要X.那么如果我:

1) Install A
2) Install B
3) Install C, which installs X, Y, Z
4) Do a pip freeze into P's requirements.txt 

那么P&#39的requirements.txt将如下所示:

1) A
2) B
3) C
4) X
5) Y
6) Z

但是在我的Python安装中实际上并不需要Y和Z来运行P.

据我所知,运行pip freeze生成P的要求将向您显示依赖关系的所有依赖关系,因此是P的实际依赖关系的超集。

4 个答案:

答案 0 :(得分:5)

virtualenv的目的是对安装的软件包进行完全控制

假设您只列出了A,B,C和X.每次从该需求文件创建一个新的virtualenv时,您将获得最新版本的Y和Z.这有几个问题:

  1. 你不可能知道你没有使用Y :对于一个足够复杂的项目,几乎不可能审核每个代码路径以确保C从不调用Y.你不仅仅是担心关于你自己的代码了;你也担心C的代码。这只是不规模。
  2. 即使你只是导入Y,你也在使用它:Python允许在导入时执行任意代码。新版本的Y可以在导入时执行各种令人讨厌的事情,例如打印到stdout,猴子修补X,或者几乎任何你能想象到的东西。精心设计的Y 不应该做这些事情,但你会发现PyPI上的软件包质量变化很大。
  3. Y的新版本可以引入新的依赖关系:如果您包含新版本的Y,您最终可能会将包W添加到您的virtualenv中,因为新版本的Y需要它。随着更多的软件包的添加,前两个问题变得更加严重。更糟糕的是,您可能会发现新版本的Y依赖于较新版本的 X ,在这种情况下,您不会最终得到您真正想要的软件包。
  4. 生成已知良好的配置更为重要pip freeze并非旨在确定最低要求。它旨在使整个应用程序能够始终如一地部署到许多不同的环境中。这意味着它会谨慎行事并列出可能会对您的项目产生合理影响的所有
  5. 出于这些原因,您不应尝试从需求文件中删除Y和Z.

答案 1 :(得分:1)

我在另一篇 stackoverflow 帖子 https://stackoverflow.com/a/65666949/1512555 中回答了这个问题,我建议使用 pip-tools 中的 pip-compile

答案 2 :(得分:0)

有一个名为pipreqs的python模块。它会基于项目中的导入生成requirements.txt。

答案 3 :(得分:0)

  1. 安装pipreqs库(例如conda install -c conda-forge pipreqs
  2. 将目录更改为项目文件夹(cd your/repository
  3. 运行命令pipreqs --force

或者只是pipreqs --force your/repository

请参阅官方资料中的其他信息: https://pypi.org/project/pipreqs/