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

检查我的Python是否有所有必需的包,python,pip,requirements.txt,Python,Pip,Requirements.txt,我有一个requirements.txt文件,其中包含我的虚拟环境所需的软件包列表。是否有可能找出文件中提到的所有包是否都存在。如果某些软件包丢失,如何查找丢失的软件包?您可以运行pip freeze查看您安装的软件包,并将其与requirements.txt文件进行比较 如果您想安装缺失的模块,可以运行pip install-r requirements.txt,这将安装任何缺失的模块,并在最后告诉您哪些模块缺失并安装了。如果requirements.txt类似于: django oursql

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

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


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

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

更新

最新和改进的方法是通过
distutils.text\u file.TextFile
。有关详细信息,请参见下面的“菜单”

原件

python的方法是通过
pkg\u资源
。需求以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)
基于,假设您确实使用了一个需求文件,您可能需要一个单元测试,可能在
tests/test_requirements.py
中,以确认包的可用性

此外,该方法使用一个独立的方法来确认每个需求。这非常有用,可以记录所有故障。在没有子测试的情况下,只记录了一次故障

“测试所需软件包的可用性。”“”
导入单元测试
从pathlib导入路径
导入pkg_资源
_REQUIREMENTS\u PATH=路径(\u文件\u).parent.with\u名称(“REQUIREMENTS.txt”)
类TestRequirements(unittest.TestCase):
“”“测试所需软件包的可用性。”“”
def测试_要求(自身):
“”“测试所需的每个软件包是否可用。”“”
#参考:https://stackoverflow.com/a/45474387/
requirements=pkg\u resources.parse\u requirements(\u requirements\u PATH.open())
对于要求中的要求:
需求=str(需求)
使用self.subTest(需求=需求):
pkg_资源需求(需求)

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

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

pip check
pipdeptree--warn fail
仅审核已安装的软件包是否相互兼容,而不检查
requirements.txt

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


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

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

$ 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

下面是一个基于Zaur Nasibov的答案的单行程序,如果您不想知道哪些软件包没有安装:

python3-c“导入pkg_资源;pkg_资源.require(open('requirements.txt',mode='r'))”&>/dev/null
然后可以使用命令是否成功完成来执行pip安装

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

python3-c“导入pkg_资源;pkg_资源.require(open('requirements.txt',mode='r')”&>/dev/null | | pip3安装-忽略已安装的-r requirements.txt
我意识到这并不是解决确切的问题,但当谷歌搜索这个问题时,这个页面首先出现。不管怎样,你只想知道缺失的依赖项是什么,然后满足它们


我们不能只使用
pip3检查
,因为它不查看
requirements.txt

如果requirements.txt包含版本信息,例如
django==1.5.1
,这将失败。如果模块也列在一行中,它将失败。如前所述,如果requirements.txt每行列出一个模块,它将起作用。您确定包名与模块名相同吗?作为奖励,
python memcached
django json field
django statsd mozilla
,等等,这会自动递归地检测冲突的版本要求——这些要求可能无法满足。使用try:except pkg_resources.DistributionNotFound包装调用来循环require调用。然后在例外情况下打印。这样,它会告诉你所有缺失的依赖项,而不会在第一个缺失的依赖项上死去。这真是个好主意!更新了已接受的答案,并参考了您的答案。@R.Ilma通过子测试,您可以准确地知道失败需求的完整子集,因此在测试时它通常很有用。如果没有子测试,您只知道第一次失败。@sinoroc实际上这个答案用于使用
pkg_资源。解析_需求,您可以在其编辑历史中确认这一点。我不得不停止使用它,因为它的API非常不稳定,并且一直在崩溃。现在我再次编辑了答案,按照你的建议使用它。@Juan Kabbali即使可能,它也是非常不标准的。包应该由包管理器管理,例如pip、poyment、conda等,因此必须运行相同的包。标准工作流程,