检查我的Python是否包含所有必需的包

Ala*_*amu 20 python pip requirements.txt

我有一个requirements.txt文件,其中包含我的虚拟环境所需的软件包列表.是否可以找出文件中提到的所有包是否存在.如果缺少某些软件包,如何找出丢失的软件包?

Zau*_*bov 46

pythonic的做法是通过distutils.text_file.TextFile API.这些要求以setuptools可以理解的格式编写.例如:

Werkzeug>=0.6.1
Flask
Django>=1.3
Run Code Online (Sandbox Code Playgroud)

示例代码:

import pkg_resources
from pkg_resources import DistributionNotFound, VersionConflict

# dependencies can be any iterable with strings, 
# e.g. file line-by-line iterator
dependencies = [
  'Werkzeug>=0.6.1',
  'Flask>=0.9',
]

# here, if a dependency is not met, a DistributionNotFound or VersionConflict
# exception is thrown. 
pkg_resources.require(dependencies)
Run Code Online (Sandbox Code Playgroud)

  • 使用try循环遍历require调用:除了pkg_resources.DistributionNotFound包装调用.然后在打印异常时.这样它就会告诉你所有缺失的依赖关系而不是死于第一个找不到的依赖关系. (2认同)

Joh*_*ang 17

您可以运行pip freeze以查看已安装的内容并将其与requirements.txt文件进行比较.

如果你想安装缺少的模块,你可以运行pip install -r requirements.txt,这将安装任何缺少的模块,并告诉你最后哪些模块丢失和安装.


yuc*_*cer 7

您可以使用其中的-r选项来pip freeze验证这一点。它会WARNING为未安装的软件包生成日志。应选择一种适当的详细模式才能WARNING显示消息。例如:

$ pip -vvv freeze -r requirements.txt | grep "not installed"

WARNING: Requirement file [requirements.txt] contains six==1.15.0, but package 'six' is not installed
Run Code Online (Sandbox Code Playgroud)

  • 这可行,但原因不明显(至少对于 pip 版本 23.0.1 而言)。pip 向 stdout 输出一系列消息,其中没有一条与“未安装”匹配,因此发送到 stdout 的所有输出都被丢弃。此外,pip 还向 stderr 输出警告消息。因此,更有效的方法是“pip freeze -rrequirements.txt > /dev/null”。 (2认同)

Acu*_*nus 6

根据Zaur回答,假设您确实使用了需求文件,则可能需要进行单元测试(可能在中)tests/test_requirements.py,以确认软件包的可用性。

此外,此方法使用子测试来独立确认每个要求。这很有用,以便记录所有故障。

"""Test availability of required packages."""

import distutils.text_file
import unittest
from pathlib import Path

import pkg_resources

_REQUIREMENTS_PATH = Path(__file__).parent.with_name("requirements.txt")


class TestRequirements(unittest.TestCase):
    """Test availability of required packages."""

    def test_requirements(self):
        """Test that each required package is available."""
        # Ref: https://stackoverflow.com/a/45474387/
        requirements = distutils.text_file.TextFile(filename=str(_REQUIREMENTS_PATH)).readlines()
        for requirement in requirements:
            with self.subTest(requirement=requirement):
                pkg_resources.require(requirement)
Run Code Online (Sandbox Code Playgroud)

请注意,这distutils.text_file.TextFile将删除注释。

  • @sinoroc 实际上,这个答案曾经使用`pkg_resources.parse_requirements`,您可以在其编辑历史记录中确认。我不得不停止使用它,因为它的 API 非常不稳定,并且经常出现故障。现在我再次编辑了答案,以按照您的建议返回使用它。 (3认同)
  • @Juan-Kabbali 即使有可能,也是非常不标准的。这些包应该由包管理器管理,例如 pip、poetry、conda 等,因此必须运行相同的包。然而,标准工作流程是首先安装定义的包列表(根据所选包管理器的使用说明),然后才运行单元测试。 (2认同)

Zim*_*biX 5

如果您不想知道哪些软件包未安装,这里有一条基于 Zaur Nasibov 的答案的简短说明:

python3 -c "import pkg_resources; pkg_resources.require(open('requirements.txt',mode='r'))" &>/dev/null
Run Code Online (Sandbox Code Playgroud)

命令是否成功完成可以用于进行 pip 安装。

作为 Ruby 的等价物bundle check || bundle install,我们正在做:

python3 -c "import pkg_resources; pkg_resources.require(open('requirements.txt',mode='r'))" &>/dev/null || pip3 install --ignore-installed -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

我意识到这并没有解决确切的问题,但是当谷歌搜索这个问题时,这个页面首先出现。无论如何,您只想知道缺少的依赖项是什么,然后才能满足它们。

我们不能仅仅用于pip3 check此目的,因为它不考虑requirements.txt