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?
9 回答
更新:
一种最新和改进的方法是通过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)
根据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)
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.
如果您有兴趣从命令行执行此操作,pip-missing-reqs
将列出缺少的包。例子:
$ pip-missing-reqs directory
Missing requirements:
directory/exceptions.py:11 dist=grpcio module=grpc
(pip check
并且pipdeptree --warn fail
仅审核已安装的软件包以确保彼此的兼容性,而无需检查requirements.txt
。)
您可以使用该-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
这是一个基于 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
跑步
pip freeze -r requirements.txt
它会将已安装的文件与需求文件进行比较,并警告您哪些不是
除了检查是否requirements.txt
安装了列出的模块之外,您可能还想检查您的项目使用的所有模块是否确实在requirements.txt
文件中列出。
如果您使用 flake8 进行样式检查,您可以为 flake8 添加flake8-requirements插件。它将自动检查导入的模块是否在setup.py
,requirements.txt
或pyproject.toml
文件中可用。此外,对于自定义模块,您可以使用已知模块添加自定义配置(以防止 flake8 警告)。有关更多配置选项,请参阅 flake8-requirements 项目的描述。
如果 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