2013-04-30 127 views

回答

34

的Python的这样做的方式是通过pkg_resourcesAPI。这些需求以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

作为奖励,它会自动递归检测冲突的版本要求 - 这些将是不可满足的。 – 2017-08-03 03:43:36

15

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

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

-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 
+4

如果requirements.txt包含版本信息例如'django == 1.5.1' – 2013-04-30 08:10:11

+0

确实。如果模块也列在一行中,它会失败。如上所述,它将工作,如果requirements.txt每行列出一个模块。 – 2013-04-30 08:13:02

+0

你确定包名与模块名相同吗? – warvariuc 2013-04-30 11:19:41

-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... 
2

基础上answer by Zaur,假设你确实使用requirements.txt文件,您可以在tests/test_requirements.py需要一个单元测试,也许,确认包的可用性。

的一般方法是:

import pathlib 
import unittest 

import pip 
import pkg_resources 


class TestRequirements(unittest.TestCase): 

    def test_requirements(self): # pylint: disable=no-self-use 
     """Recursively confirm that requirements are available. 

     This implementation is tested to be compatible with pip 9.0.1. 
     """ 
     requirements_path = pathlib.Path(__file__).parents[1]/'requirements.txt' 
     requirements = pip.req.parse_requirements(str(requirements_path), session=pip.download.PipSession()) 
     requirements = [str(r.req) for r in requirements] 
     pkg_resources.require(requirements) 

注意,这个答案使用pathlib它可在Python 3而不是在Python 2.如果使用Python 2,先安装它的反向移植是pathlib2

+0

这确实是个好主意! – 2017-08-03 05:37:12

相关问题