Muszę wiedzieć, czy istnieje moduł Pythona, bez importowania go.
Importowanie czegoś, co może nie istnieć (nie tego, czego chcę):
try:
import eggs
except ImportError:
pass
python
python-import
yarbelk
źródło
źródło
Odpowiedzi:
Python2
Aby sprawdzić, czy import może znaleźć coś w python2, użyj
imp
Aby znaleźć import z kropkami, musisz zrobić więcej:
Możesz także użyć
pkgutil.find_loader
(mniej więcej tego samego, co część python3Python3
Python3 ≤ 3,3
Powinieneś użyć
importlib
, jak sobie z tym radziłem:Oczekuję, że jeśli znajdziesz do tego ładowarkę, to ona istnieje. Możesz też podejść do tego nieco sprytniej, na przykład odfiltrowywać, które programy ładujące zaakceptujesz. Na przykład:
Python3 ≥ 3.4
W
importlib.find_loader
Pythonie 3.4 dokumentacja pythona została wycofana na korzyśćimportlib.util.find_spec
. Zalecaną metodą jestimportlib.util.find_spec
. Istnieją inneimportlib.machinery.FileFinder
, które są przydatne, jeśli chcesz załadować określony plik. Ustalenie, jak ich używać, wykracza poza zakres tego.Działa to również w przypadku importu względnego, ale musisz dostarczyć pakiet startowy, więc możesz również:
Chociaż jestem pewien, że istnieje powód, aby to zrobić - nie jestem pewien, co by to było.
OSTRZEŻENIE
Próbując znaleźć podmoduł, zaimportuje on moduł nadrzędny (dla wszystkich powyższych metod)!
mile widziane komentarze dotyczące obejścia tego problemu
Podziękowanie
find_loader
źródło
eggs.ham.spam
.spam
weggs.ham
jakich można użyćimp.find_module('spam', ['eggs', 'ham'])
imp
jest wycofywane na korzyśćimportlib
.pkgutil.find_loader("my.package.module")
zwraca program ładujący, jeśli pakiet / moduł istnieje, aNone
jeśli nie. Zaktualizuj swoją odpowiedź dla Pythona 2, ponieważ maskowaniePo użyciu odpowiedzi yarbelk zrobiłem to, aby nie musieć importować
ìmp
.Przydatne
settings.py
na przykład w Django .źródło
Python 3> = 3.6: ModuleNotFoundError
ModuleNotFoundError
Został wprowadzony w Pythonie 3.6 i mogą być wykorzystane do tego celuBłąd jest zgłaszany, gdy nie można znaleźć modułu lub jednego z jego elementów nadrzędnych . Więc
wypisze komunikat, który wygląda tak,
No module named 'eggs'
jakbyeggs
nie można było znaleźć modułu; ale wypisze coś takiegoNo module named 'eggs.sub'
, jak gdybysub
nie można było znaleźć modułu, ale można znaleźćeggs
pakiet.Zobacz dokumentację systemu importu, aby uzyskać więcej informacji na temat
ModuleNotFoundError
źródło
Python 2, bez polegania na ImportError
Dopóki aktualna odpowiedź nie zostanie zaktualizowana, oto sposób na Python 2
Dlaczego inna odpowiedź?
Wiele odpowiedzi wykorzystuje przechwycenie pliku
ImportError
. Problem w tym, że nie wiemy, co rzucaImportError
.Jeśli zaimportujesz istniejący moduł i zdarzy się, że
ImportError
w Twoim module znajduje się jakiś (np. Literówka w linii 1), to spowoduje, że moduł nie istnieje. Zajmie ci to sporo czasu, aby dowiedzieć się, że twój moduł istnieje,ImportError
został złapany i powoduje cichą awarię.źródło
ImportError
- prosimy o dokonanie edycji, jeśli nie jest to dla Ciebie jasne.odpowiedź go_as jako jedna linijka
źródło
Natknąłem się na to pytanie, szukając sposobu na sprawdzenie, czy moduł jest ładowany z linii poleceń i chciałbym podzielić się przemyśleniami na temat tych, którzy idą za mną i szukają tego samego:
Metoda pliku skryptu Linux / UNIX : utwórz plik
module_help.py
:Następnie upewnij się, że jest wykonywalny:
chmod u+x module_help.py
I zadzwoń
pipe
dogrep
:Metoda interaktywna : w konsoli load
python
Jeśli zostanie znaleziony, zakończ czytanie, wpisując
q
Aby wyjść z sesji interaktywnej Pythona, naciśnij Ctrl+D
Metoda pliku skryptu Windows również kompatybilna z Linux / UNIX i ogólnie lepsza :
Wywołanie go z polecenia, takiego jak:
Wynikałoby:
i musiałbyś nacisnąć,
q
aby wyjść z trybu interaktywnego.Korzystanie z nieznanego modułu:
Wynikałoby:
i wyjdź.
źródło
Użyj jednej z funkcji z pkgutil , na przykład:
źródło
Prostsza instrukcja if z AskUbuntu: Jak sprawdzić, czy moduł jest zainstalowany w Pythonie?
źródło
Możesz po prostu napisać mały skrypt, który spróbuje zaimportować wszystkie moduły i powie Ci, które z nich nie działają, a które działają:
Wynik:
Słowo ostrzeżenia, że spróbuje zaimportować wszystko, więc zobaczysz rzeczy, takie jak
PyYAML failed with error code: No module named pyyaml
faktyczna nazwa importu to po prostu yaml. Tak długo, jak wiesz, że importujesz, powinno to załatwić sprawę.źródło
Napisałem tę funkcję pomocniczą:
źródło
Możesz również użyć
importlib
bezpośrednioźródło
Nie ma sposobu, aby wiarygodnie sprawdzić, czy „moduł z kropkami” jest możliwy do zaimportowania bez importowania jego pakietu nadrzędnego. Mówiąc to, istnieje wiele rozwiązań problemu „jak sprawdzić, czy istnieje moduł Pythona”.
Poniższe rozwiązanie rozwiązuje problem polegający na tym, że importowany moduł może wywołać ImportError, nawet jeśli istnieje. Chcemy odróżnić tę sytuację od takiej, w której moduł nie istnieje.
Python 2 :
Python 3 :
źródło
w django.utils.module_loading.module_has_submodule
źródło