Mam plik requirements.txt
z listą pakietów, które są wymagane dla mojego środowiska wirtualnego. Czy możliwe jest sprawdzenie, czy wszystkie pakiety wymienione w pliku są obecne. Jeśli brakuje niektórych pakietów, jak dowiedzieć się, jakie są brakujące pakiety?Jak sprawdzić, czy mój Python ma wszystkie wymagane pakiety?
Odpowiedz
pythonic sposób to zrobić za pośrednictwem pkg_resources
API. 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)
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.
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
Nie powiedzie się, jeśli require.txt zawiera informacje o wersji, np. 'django == 1.5.1' –
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ę. –
Czy jesteś pewien, że nazwa pakietu jest taka sama jak nazwa modułu? – warvariuc
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...
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
.
To naprawdę świetny pomysł! –
- 1. Jak sprawdzić, czy mój program ma podłączone do niego dane
- 2. Jak mogę sprawdzić, czy mój identyfikator elementu ma fokus?
- 3. Jak sprawdzić, czy ciąg ma wartość zerową w python?
- 4. Sublime Text: wyłączyć wszystkie pakiety
- 5. Jak sprawdzić, czy SQLDataReader nie ma wierszy
- 6. RVM zainstalować Ruby 1.9.3: Brakujące wymagane pakiety
- 7. Pakiety w języku Python?
- 8. Czy Python ma odpowiednik "przełącznika"?
- 9. Flask-WTForms: jak sprawdzić, czy pole jest wymagane?
- 10. Jak sprawdzić, czy selektor ma qtip?
- 11. jak sprawdzić, czy uitableview ma wybraną komórkę
- 12. Jak sprawdzić, czy obiekt ma funkcję? (Dojo)
- 13. Szyny: Jak sprawdzić, czy kolumna ma wartość?
- 14. Jak sprawdzić, czy liczba ma dziesiętną?
- 15. Jak sprawdzić, czy proces ma uprawnienia administracyjne
- 16. Jak sprawdzić, czy obiekt ma określoną właściwość?
- 17. Jak sprawdzić, czy iPhone ma podwójny aparat?
- 18. Jak sprawdzić, czy klasa ma atrybut DataContract?
- 19. Jak sprawdzić, czy mój bieżący wątek jest wątkiem interfejsu użytkownika?
- 20. Jak sprawdzić, czy mój klucz istnieje w obiekcie tablicy
- 21. Jak mogę sprawdzić, czy łańcuch ma w Pythonie wartość liczbową?
- 22. Jak mogę sprawdzić, czy mój procesor ma 32 lub 64 bity?
- 23. Jak sprawdzić, czy wszystkie wiersze są równe w numpy?
- 24. PHP: sprawdzić, czy wszelkie opublikowane Vars są puste - formularz: wszystkie pola wymagane
- 25. Jak sprawdzić, czy mój sterownik skanera jest kompatybilny z TWAIN?
- 26. Jak sprawdzić, czy mój program jest rurami do drugiej (Perl)
- 27. Jak sprawdzić, czy mój usługodawca internetowy blokuje port 25?
- 28. Jak mogę sprawdzić, czy mój skrypt Perla działa pod Windows?
- 29. Jak mogę sprawdzić, czy mój kontekst jest nadal ważny?
- 30. java - Jak sprawdzić, czy mój obiekt jest typu danej klasy?
Jako bonus automatycznie rekurencyjnie wykrywa sprzeczne wymagania wersji - byłyby one niezadowalające. –