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

时间:2013-04-30 07:48:53

标签: python pip requirements.txt

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

10 个答案:

答案 0 :(得分:41)

pythonic的做法是通过pkg_resources API。这些要求以setuptools可以理解的格式编写。 E.g:

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)

答案 1 :(得分:17)

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

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

答案 2 :(得分:6)

基于answer by Zaur,假设您确实使用了requirements.txt文件,您可能希望在tests/test_requirements.py中进行单元测试,以确认包的可用性。

此方法使用subtest来独立确认每项要求。这很有用,可以记录所有故障。

from pathlib import Path
import unittest

import pkg_resources


class TestRequirements(unittest.TestCase):
    def test_requirements(self):
        """Recursively confirm that requirements are available."""
        # Ref: https://stackoverflow.com/a/45474387/
        requirements = (Path(__file__).parents[1] / 'requirements.in').read_text().strip().split('\n')
        requirements = [r.strip() for r in requirements]
        requirements = [r for r in sorted(requirements) if r and not r.startswith('#')]
        for requirement in requirements:
            with self.subTest(requirement=requirement):
                pkg_resources.require(requirement)

答案 3 :(得分:1)

这是基于 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

答案 4 :(得分:0)

如果您有兴趣从命令行执行此操作,pip-missing-reqs将列出丢失的软件包。示例:

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

({pip checkpipdeptree --warn fail仅审核已安装的软件包是否相互兼容,而无需检查requirements.txt。)

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

您可以使用-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

答案 7 :(得分:0)

运行

pip freeze -r requirements.txt

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

答案 8 :(得分:-1)

您可以创建一个访问系统站点包的virtualenv,并测试是否安装了包(或其他依赖项)。这样就没有真正安装软件包(如果你只想检查)。使用virtualenv wrapper的示例如下:

$ cat requirements.txt 
requests
simplejson

$ mkvirtualenv --system-site-packages test
Running virtualenv with interpreter /usr/bin/python2
New python executable in test/bin/python2
Also creating executable in test/bin/python
Installing setuptools, pip...done.

$ pip install -r requirements.txt
Downloading/unpacking requests (from -r requirements.txt (line 1))
  Downloading requests-2.10.0-py2.py3-none-any.whl (506kB): 506kB downloaded
Requirement already satisfied (use --upgrade to upgrade): simplejson in /usr/lib/python2.7/dist-packages (from -r requirements.txt (line 2))
Installing collected packages: requests
Successfully installed requests
Cleaning up...

$ pip install -r requirements.txt
Requirement already satisfied (use --upgrade to upgrade): requests in /home/yucer/.virtualenvs/test/lib/python2.7/site-packages (from -r requirements.txt (line 1))
Requirement already satisfied (use --upgrade to upgrade): simplejson in /usr/lib/python2.7/dist-packages (from -r requirements.txt (line 2))
Cleaning up...

$ deactivate

$ rmvirtualenv test
Removing test...

答案 9 :(得分:-2)

如果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