2013-04-30 14 views

Antwort

34

Die pythonic Art und Weise es zu tun ist über die pkg_resourcesAPI. Die Anforderungen sind in einem Format verfasst, das von setsetools verstanden wird. Z. B:

Werkzeug>=0.6.1 
Flask 
Django>=1.3 

Der Beispielcode:

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

Als ein Bonus erkennt dies automatisch rekursiv widersprüchliche Versionsanforderungen - diese wären unerfüllbar. –

15

Sie können pip freeze ausführen, um zu sehen, was Sie installiert haben und vergleichen Sie es mit Ihrer requirements.txt Datei.

Wenn Sie fehlende Module installieren möchten, können Sie pip install -r requirements.txt ausführen, und das wird fehlende Module installieren und Ihnen am Ende sagen, welche fehlten und installiert wurden.

-2

Wenn requirements.txt ist wie:

django 
oursql 
sys 
notexistingmodule 

Dann wird das folgende Skript wird Ihnen sagen, welche Module fehlen:

#!/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) 

Dies würde drucken:

[ERROR] Missing module: notexistingmodule 
+4

Dies würde fehlschlagen, wenn die requirements.txt Versionsinformationen enthält, z. 'django == 1.5.1' –

+0

Tatsächlich. Und es wird fehlschlagen, wenn Module auch in einer Zeile aufgeführt sind. Es wird, wie gesagt, funktionieren, wenn die requirements.txt ein Modul pro Zeile auflistet. –

+0

Sind Sie sicher, dass der Paketname mit dem Modulnamen übereinstimmt? – warvariuc

-1

Sie einen virtualenv mit Zugriff auf die System Website-Pakete erstellen und testen, prüfen, ob das Paket (oder eine andere Abhängigkeiten) installiert ist oder nicht. Auf diese Weise werden die Pakete nicht wirklich installiert (wenn Sie nur überprüfen möchten). Ein Beispiel virtualenv wrapper Verwendung wäre:

$ 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

Basierend auf der answer by Zaur, vorausgesetzt, Sie sind in der Tat eine requirements.txt-Datei verwenden, können Sie ein Gerät zu testen möchten, vielleicht in tests/test_requirements.py, dass bestätigt die Verfügbarkeit von Paketen.

Der allgemeine Ansatz ist:

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) 

Beachten Sie, dass diese Antwort pathlib verwendet, die in Python 3, aber nicht in Python 2. Bei der Verwendung von Python 2, installieren Sie zunächst die Rückportierung für sie die pathlib2 ist verfügbar.

+0

Das ist wirklich eine großartige Idee! –

Verwandte Themen