pip的requirements.txt最佳实践

2024-09-29 01:28:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为某人生成requirements.txt以复制我的环境。你可能知道,标准方法是

pip freeze > requirements.txt

我注意到这将列出所有软件包,包括已安装软件包的依赖项,这使得这个列表不必要。然后我四处浏览,发现^{}允许我们只列出requirements.txt中已安装的软件包

现在,根据我的理解,当有人试图用pip install -r requirements.txt复制环境时,这将自动安装已安装包的依赖项

如果这是真的,这意味着使用pip-chill而不是pip来生成requirements.txt是安全的。我的问题是,是否有任何其他风险会忽略使用pip-chill的已安装软件包的依赖项,而我在这里缺少这些依赖项


Tags: installpip方法txt列表标准环境requirements
2条回答

在我看来requirements.txt文件应该列出所有依赖项、直接依赖项以及它们的依赖项(间接的、暂时的)。如果出于某种原因,只需要直接依赖项,那么有一些工具可以帮助实现这一点,从粗略的角度来看,pipchill似乎不够,因为它实际上没有查看代码来确定直接导入了哪些包。也许最好看看像pipreqspigar这样的项目,它们在计算实际的直接依赖关系时似乎更准确(基于代码中的导入)

但是在一天结束的时候,你应该手工整理这些清单。在编写代码时,您要仔细选择要导入的包,同样要小心地整理包含这些包的项目(及其版本)列表。工具可以提供帮助,但开发人员更清楚

我相信在构建requirements.txt时,使用来自pip-toolspip-compile是一个很好的实践。这将确保构建是可预测和确定的

使用pip-compile命令可以从依赖项编译requirements.txt文件,该文件在setup.pyrequirements.in中指定

以下是我建议的构建requirements.txt的步骤(如果使用requirements.in):

  1. 创建虚拟环境并在那里安装pip工具
$ source /path/to/venv/bin/activate
(venv)$ python -m pip install pip-tools
  1. 指定应用程序/项目的直接依赖项以满足您的需求。在文件中:
# requirements.in
requests
boto3==1.16.51
  1. 使用pip编译生成requirements.txt
$ pip-compile  output-file=- > requirements.txt

您的requirements.txt文件将包含:

#
# This file is autogenerated by pip-compile
# To update, run:
#
#    pip-compile  output-file=-
#
boto3==1.16.51
    # via -r requirements.in
botocore==1.19.51
    # via
    #   boto3
    #   s3transfer
certifi==2020.12.5
    # via requests
chardet==4.0.0
    # via requests
idna==2.10
    # via requests
jmespath==0.10.0
    # via
    #   boto3
    #   botocore
python-dateutil==2.8.1
    # via botocore
requests==2.25.1
    # via -r requirements.in
s3transfer==0.3.3
    # via boto3
six==1.15.0
    # via python-dateutil
urllib3==1.26.2
    # via
    #   botocore
    #   requests

您的应用程序应该始终使用从该生成的requirements.txt安装的依赖项。如果必须更新依赖项,则只需更新requirements.in文件并重做pip-compile。我相信这是一个比我看到有些人做的更好的方法

我想使用它的主要优点是,您可以在一个单独的requirement.in文件中跟踪项目的实际直接依赖关系

我发现这与使用package.json(requirements.in)和package-lock.json(requirements.txt)在节点应用程序项目中管理节点模块/依赖项的方式非常相似

相关问题 更多 >