2015-05-21 18 views
3

我应该如何为Python项目生成requirements.txt?我应该如何生成requirements.txt? Pip冻结不是一种好方法

这是我用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的requirements.txt会看像:

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

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

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

+0

我不认为这是一个问题。 如果需求指定依赖关系的依赖关系,它是否会造成任何危害?即使您手动运行并从requirements.txt文件中除去X,Y,Z,也会在安装C时安装X,Y,Z。 pip冻结使安装依赖对用户是透明的。在运行pip冻结之前,请注意在虚拟环境中安装与项目相关的所有内容。 –

+0

我猜“问题”我的意思是我想要P的最低要求集合作为P的requirements.txt运行。但是由于上面的问题,要求将比P运行所需的要多得多。 – Tommy

+0

您需要C for P才能运行。 C需要Y和Z才能运行。通过传递性,你需要Y和Z来运行。 requirements.txt的要点是,只有当你自己改变它们时,你的包才会改变。如果我们没有记录Y和Z的版本,那是不可能的。 – Kevin

回答

5

virtualenv的目的是让总控制覆盖安装的软件包。

假设你只上市的A,B,C和X创建从需求文件新的virtualenv每一次,你会得到Y和Z的最新版本有几个问题是:

  1. 你不知道你不使用Y:对于一个足够复杂的项目,几乎不可能审计每个代码路径以确保C永远不会调用Y.你不只是担心自己的代码任何更多;你也担心C的代码。这只是不能缩放。
  2. 即使您只是导入Y,您也正在使用它:Python允许在导入时执行任意代码。一个新版本的Y可以在导入时做各种令人讨厌的事情,比如打印到标准输出,猴子补丁X或者其他任何你能想象到的东西。一个精心设计的Y 不应该做这些事情,但你会发现在PyPI上的软件包的质量变化很大。
  3. Y的新版本可能引入新的依赖关系:如果包含新版本的Y,则最终可能会将包W也添加到您的virtualenv中,因为新版本的Y需要它。随着更多的软件包的添加,前两个问题更加恶化。更糟糕的是,您可能会发现Y的新版本取决于较新版本的X,在这种情况下,您将不会收到您实际需要的软件包。
  4. 生成一个已知良好的配置更重要pip freeze不是为了找出最低要求而设计的。它旨在使整个应用程序能够始终部署到许多不同的环境。这意味着它会在谨慎的方面犯错,并列出的一切这可能会对您的项目产生合理影响。

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

+0

好的,谢谢你,这是非常有用的,是一个很好的学习回答! – Tommy