39

I have a requirements.txt file with a list of packages that are required for my virtual environment. Is it possible to find out whether all the packages mentioned in the file are present. If some packages are missing, how to find out which are the missing packages?

4

9 回答 9

57

更新

一种最新和改进的方法是通过distutils.text_file.TextFile. 有关详细信息,请参阅下面的 Acumenus答案

原件

这样做的 Pythonic 方式是通过pkg_resources API。要求以 setuptools 可以理解的格式编写。例如:

Werkzeug>=0.6.1
Flask
Django>=1.3

示例代码:

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)
于 2013-04-30T11:04:50.807 回答
20

根据Zaur 的回答,假设您确实使用了需求文件,您可能需要一个单元测试,也许在 中tests/test_requirements.py,以确认包的可用性。

此外,这种方法使用子测试来独立确认每个要求。这很有用,以便记录所有故障。如果没有子测试,只会记录一个失败。

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

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 = pkg_resources.parse_requirements(_REQUIREMENTS_PATH.open())
        for requirement in requirements:
            requirement = str(requirement)
            with self.subTest(requirement=requirement):
                pkg_resources.require(requirement)
于 2017-08-03T03:41:34.907 回答
19

You can run pip freeze to see what you have installed and compare it to your requirements.txt file.

If you want to install missing modules you can run pip install -r requirements.txt and that will install any missing modules and tell you at the end which ones were missing and installed.

于 2013-04-30T07:53:36.930 回答
3

如果您有兴趣从命令行执行此操作,pip-missing-reqs将列出缺少的包。例子:

$ pip-missing-reqs directory
Missing requirements:
directory/exceptions.py:11 dist=grpcio module=grpc

pip check并且pipdeptree --warn fail仅审核已安装的软件包以确保彼此的兼容性,而无需检查requirements.txt。)

于 2019-09-13T17:21:13.623 回答
2

您可以使用该-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
于 2020-11-21T23:04:03.590 回答
2

这是一个基于 Zaur Nasibov 的回答的单行代码,如果您不想知道未安装哪些软件包:

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

然后可以使用命令是否成功完成来进行 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

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

我们不能只pip3 check用于这个,因为它不看requirements.txt

于 2021-01-07T02:59:05.920 回答
2

跑步

pip freeze -r requirements.txt

它会将已安装的文件与需求文件进行比较,并警告您哪些不是

于 2021-07-06T19:41:03.313 回答
0

除了检查是否requirements.txt安装了列出的模块之外,您可能还想检查您的项目使用的所有模块是否确实在requirements.txt文件中列出。

如果您使用 flake8 进行样式检查,您可以为 flake8 添加flake8-requirements插件。它将自动检查导入的模块是否在setup.py,requirements.txtpyproject.toml文件中可用。此外,对于自定义模块,您可以使用已知模块添加自定义配置(以防止 flake8 警告)。有关更多配置选项,请参阅 flake8-requirements 项目的描述。

于 2020-04-07T20:44:48.337 回答
-6

如果 requirements.txt 是这样的:

django
oursql
sys
notexistingmodule

然后以下脚本将告诉您缺少哪些模块:

#!/usr/bin/python3
fname = 'requirements.txt'
with open(fname, 'r', encoding='utf-8') as fhd:
    for line in fhd:
        try:
            exec("import " + line)
        except:
            print("[ERROR] Missing module:", line)

这将打印:

[ERROR] Missing module: notexistingmodule
于 2013-04-30T08:07:12.113 回答