Jaki jest dobry sposób sprawdzenia, czy pakiet jest zainstalowany w skrypcie Pythona? Wiem, że to łatwe od tłumacza, ale muszę to zrobić w ramach scenariusza.
Myślę, że mógłbym sprawdzić, czy w systemie jest katalog utworzony podczas instalacji, ale czuję, że jest lepszy sposób. Próbuję się upewnić, że pakiet Skype4Py jest zainstalowany, a jeśli nie, zainstaluję go.
Moje pomysły na wykonanie czeku
- sprawdź katalog w typowej ścieżce instalacji
- spróbuj zaimportować pakiet, a jeśli wyjątek zostanie zgłoszony, zainstaluj pakiet
python
package
skype
python-import
Kevin
źródło
źródło
Odpowiedzi:
Jeśli masz na myśli skrypt w Pythonie, zrób coś takiego:
Python 3.3+ używa sys.modules i find_spec :
Python 3:
Python 2:
źródło
Zaktualizowana odpowiedź
Lepszym sposobem na to jest:
Wynik:
Sprawdź, czy
requests
jest zainstalowany:Dlaczego w ten sposób? Czasami występują kolizje nazw aplikacji. Importowanie z przestrzeni nazw aplikacji nie daje pełnego obrazu tego, co jest zainstalowane w systemie.
Zwróć uwagę, że proponowane rozwiązanie działa:
pip install http://some.site/package-name.zip
lub dowolnego innego typu archiwum).python setup.py install
.sudo apt install python-requests
.Przypadki, w których może to nie działać:
python setup.py develop
.pip install -e /path/to/package/source/
.Stara odpowiedź
Lepszym sposobem na to jest:
Dla pip> = 10.x użyj:
Dlaczego w ten sposób? Czasami występują kolizje nazw aplikacji. Importowanie z przestrzeni nazw aplikacji nie daje pełnego obrazu tego, co jest zainstalowane w systemie.
W rezultacie otrzymasz listę
pkg_resources.Distribution
obiektów. Zobacz poniższy przykład:Zrób ich listę:
Sprawdź, czy
requests
jest zainstalowany:źródło
import json
rzeczywiście działa). W tym przypadku działa metoda ice.nicer.if "u'requests'" in installed_packages:
z Zaktualizowanej odpowiedzi, aby dla mnie zadziałał. Wyjścieprint()
tworzy to na moim pythonie macOS:[..., u'pytz', u'requests', ...]
if "requests'"
(zwróć uwagę na pojedynczy cudzysłów na końcu). w ogóle nie ma sensu.pip
. Np. Możesz stworzyć i zainstalować pakiet ze źródła. Ta odpowiedź ich nie znajdzie. Odpowiedź z @ ice.nicer na tematfind_spec()
jest prawidłowa.Jak Pythona 3.3, można użyć find_spec () metody
źródło
importlib.util.find_spec('google-cloud-logging')
nic nie znajduje, gdyimportlib.util.find_spec('google.cloud.logging')
zostanie znalezione. Oficjalna nazwa i nazwa, którą pokazuje pip, zawiera myślniki, a nie kropki. Może to być mylące, dlatego należy zachować ostrożność.Jeśli chcesz mieć czek z terminala, możesz biec
a jeśli nic nie zostanie zwrócone, pakiet nie zostanie zainstalowany.
Jeśli być może chcesz zautomatyzować to sprawdzenie, aby na przykład zainstalować go, jeśli go brakuje, możesz mieć następujące elementy w swoim skrypcie bash:
źródło
if
do bezpośredniego przetestowania udanego polecenia:if pip3 show package_name 1>/dev/null; then ...
Jako rozszerzenie tej odpowiedzi :
Dla Pythona 2. *,
pip show <package_name>
wykona to samo zadanie.Na przykład
pip show numpy
zwróci następujące lub podobne:źródło
Możesz użyć modułu pkg_resources z setuptools. Na przykład:
Zauważ, że istnieje różnica między modułem Pythona a pakietem Pythona. Pakiet może zawierać wiele modułów, a nazwy modułów mogą nie odpowiadać nazwie pakietu.
źródło
Otwórz typ wiersza polecenia
źródło
Chciałbym dodać swoje przemyślenia / ustalenia do tego tematu. Piszę skrypt, który sprawdza wszystkie wymagania programu na zamówienie. Istnieje również wiele testów z modułami Pythona.
Jest mały problem z
rozwiązanie. W moim przypadku jeden z modułów Pythona wywołał
python-nmap
, ale importujesz go zimport nmap
i jak widzisz niezgodność nazw. Dlatego test z powyższym rozwiązaniem zwraca wynik Fałsz, a także importuje moduł po trafieniu, ale być może nie ma potrzeby używania dużej ilości pamięci do prostego testu / sprawdzenia.Ja też to znalazłem
installed_packages
będzie mieć tylko te pakiety, które zostały zainstalowane za pomocą pip . W moim systemiepip freeze
wraca przez40
moduły Pythona, podczas gdyinstalled_packages
ma tylko ten1
, który zainstalowałem ręcznie (python-nmap).Kolejne rozwiązanie poniżej, o którym wiem, może nie mieć związku z pytaniem , ale myślę, że dobrą praktyką jest oddzielenie funkcji testowej od tej, która wykonuje instalację, może być przydatna dla niektórych.
Rozwiązanie, które zadziałało dla mnie. Opiera się na tej odpowiedzi Jak sprawdzić, czy moduł Pythona istnieje bez importowania go
UWAGA: to rozwiązanie nie może znaleźć modułu również po nazwie
python-nmap
, muszę go użyćnmap
(łatwy w użyciu), ale w tym przypadku moduł nie zostanie w ogóle załadowany do pamięci.źródło
Jeśli chcesz, aby Twój skrypt zainstalował brakujące pakiety i kontynuował, możesz zrobić coś takiego (na przykładzie modułu 'krbV' w pakiecie 'python-krbV'):
źródło
Szybkim sposobem jest użycie narzędzia wiersza poleceń w języku Python . Po prostu wpisz.
import <your module name>
Jeśli brakuje modułu, pojawi się błąd.źródło
Hmmm ... najbliższa wygodnej odpowiedzi, jaką widziałem, to użycie wiersza poleceń do wypróbowania importu. Ale wolę nawet tego unikać.
Co powiesz na „zamrażanie pip” | grep pkgname '? Próbowałem i działa dobrze. Pokazuje również wersję, którą ma i czy jest zainstalowana pod kontrolą wersji (zainstaluj), czy może być edytowana (programuj).
źródło
class myError (wyjątek): pass #lub zrób coś spróbuj: zaimportuj mymodule z wyjątkiem ImportError as e: raise myError ("wystąpił błąd")
źródło
W typie terminala
Przykład
źródło
Chciałbym skomentować odpowiedź @ ice.nicer, ale nie mogę, więc ... Z moich obserwacji wynika, że pakiety z myślnikami są zapisywane z podkreśleniami, a nie tylko kropkami, jak wskazuje komentarz @dwich
Na przykład tak
pip3 install sphinx-rtd-theme
, ale:importlib.util.find_spec(sphinx_rtd_theme)
zwraca Objectimportlib.util.find_spec(sphinx-rtd-theme)
zwraca Noneimportlib.util.find_spec(sphinx.rtd.theme)
podnosi ModuleNotFoundErrorCo więcej, niektóre imiona uległy całkowitej zmianie. Na przykład robisz,
pip3 install pyyaml
ale jest zapisywany po prostu jakoyaml
Używam Pythona3.8
źródło
źródło
Wybierz opcję nr 2. Jeśli
ImportError
zostanie wyrzucony, pakiet nie jest zainstalowany (lub nie jest wsys.path
).źródło