python-3.x - 我应该如何生成requirements.txt? pip 卡住不是一个好方法

标签 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的requirements.txt如下所示:
1) A
2) B
3) C
4) X
5) Y
6) Z

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

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

最佳答案

virtualenv的目的是完全控制已安装的软件包。

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

  • 您不知道您没有使用Y :对于一个足够复杂的项目,几乎不可能审核每个代码路径以确保C永远不会调用Y。您也担心C的代码。这只是无法扩展。
  • 即使您只是导入Y,也要使用它:Python允许在导入时执行任意代码。一个新版本的Y可以在导入时做各种令人讨厌的事情,例如打印到stdout,对X进行猴子修补,或者几乎可以想象的任何其他事情。设计良好的Y不应执行这些操作,但是您会发现PyPI上软件包的质量变化很大。
  • Y的新版本可以引入新的依赖项:如果包含新版本的Y,则最终也可能将包W添加到您的virtualenv中,因为新版本的Y需要它。随着添加更多软件包,前两个问题更加严重。更糟糕的是,您可能会发现Y的新版本取决于X的新版本,在这种情况下,您将不会获得真正想要的软件包。
  • 产生已知有效的配置更为重要:pip freeze并非旨在找出最低要求。它旨在使将完整的应用程序一致地部署到许多不同的环境中。这意味着它会谨慎行事,并列出可能会合理影响您的项目的所有内容。

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

    关于python-3.x - 我应该如何生成requirements.txt? pip 卡住不是一个好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30363976/

    相关文章:

    python - 如何在Python3中加速 "for loop"

    python - 如何将 pathlib 与子进程一起使用

    python - distutils索引错误: tuple index out of range

    python - 尝试使用 pip 安装 django-heroku 时如何修复错误 "ERROR: Command errored out with exit status 1: python."

    python - 无法使用 "setuptools pip wheel failed with error code 1"创建虚拟环境

    python - 只有 "Whitespace"规则的 Spacy 分词器

    python-3.x - Pycrypto 的 CBC 模式 AES 加密问题

    linux - 设置 'correct' pip3

    linux pip包安装报错

    python3.7 没有名为 pip 的模块