我有一个requirements.txt
文件,其中包含我的虚拟环境所需的软件包列表。是否可以找出文件中提到的所有包是否存在。如果缺少某些软件包,如何找出缺少的软件包?
答案 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 check
和pipdeptree --warn fail
仅审核已安装的软件包是否相互兼容,而无需检查requirements.txt
。)
答案 5 :(得分:0)
除了检查是否安装了requirements.txt
中列出的模块之外,您可能还希望检查项目中所有使用的模块是否确实在requirements.txt
文件中列出。
如果您使用flake8进行样式检查,则可以为flake8添加flake8-requirements插件。它将自动检查导入的模块在setup.py
,requirements.txt
或pyproject.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