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

Tom*_*mmy 5 pip python-3.x

我应该如何为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 
Run Code Online (Sandbox Code Playgroud)

然后P的requirements.txt看起来像:

1) A
2) B
3) C
4) X
5) Y
6) Z
Run Code Online (Sandbox Code Playgroud)

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

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

Kev*_*vin 7

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不是为了确定最低要求.它旨在使整个应用程序能够始终如一地部署到许多不同的环境中.这意味着它会慎之又慎的一侧,并列出一切可能合理影响您的项目.

出于这些原因,您不应尝试从需求文件中删除Y和Z.


小智 6

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