2013-04-30 3 views

Odpowiedz

34

pythonic sposób to zrobić za pośrednictwem pkg_resourcesAPI. Wymagania są napisane w formacie zrozumiałym dla setuptools. Np:

Werkzeug>=0.6.1 
Flask 
Django>=1.3 

Kod przykład:

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

Jako bonus automatycznie rekurencyjnie wykrywa sprzeczne wymagania wersji - byłyby one niezadowalające. –

15

Można uruchomić pip freeze, aby sprawdzić, co zainstalowałeś i porównać z plikiem requirements.txt.

Jeśli chcesz zainstalować brakujące moduły, możesz uruchomić program pip install -r requirements.txt, który zainstaluje brakujące moduły i poinformuje Cię, których brakuje i które zostały zainstalowane.

-2

Jeśli requirements.txt jest jak:

django 
oursql 
sys 
notexistingmodule 

Następnie poniższy skrypt powie, jakie moduły brakuje:

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

Byłoby to wydrukować:

[ERROR] Missing module: notexistingmodule 
+4

Nie powiedzie się, jeśli require.txt zawiera informacje o wersji, np. 'django == 1.5.1' –

+0

Rzeczywiście. I nie powiedzie się, jeśli moduły są wymienione również w jednym wierszu. Będzie działać, jak stwierdzono, jeśli require.txt wyświetli jeden moduł na linię. –

+0

Czy jesteś pewien, że nazwa pakietu jest taka sama jak nazwa modułu? – warvariuc

-1

Można utworzyć virtualenv dostęp do pakietów miejscu systemu i sprawdzić sprawdzić czy pakiet (lub innego zależności) są zainstalowane czy nie. W ten sposób pakiety nie są naprawdę zainstalowane (jeśli chcesz tylko sprawdzić). Przykładem korzystania virtualenv wrapper byłoby:

$ 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

podstawie answer by Zaur, zakładając, że rzeczywiście użyć pliku requirements.txt, można badanej jednostki, może w tests/test_requirements.py, że potwierdza dostępności pakietów.

Ogólne podejście jest:

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) 

Zauważ, że ta odpowiedź wykorzystuje pathlib która jest dostępna w Pythonie 3, ale nie w Pythonie 2. W przypadku korzystania z Python 2, najpierw zainstalować backportu za to co jest pathlib2.

+0

To naprawdę świetny pomysł! –

Powiązane problemy