2013-04-30 131 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

相關問題