Jak sprawdzić, czy gdzieś w kodzie zaimportowałem moduł?
if not has_imported("somemodule"):
print('you have not imported somemodule')
Powodem, dla którego chciałbym sprawdzić, czy już zaimportowałem moduł, jest to, że mam moduł, którego nie chcę importować, ponieważ czasami psuje mój program.
python
python-import
yuval
źródło
źródło
raise SystemError()
(lub inny wybrany przez siebie wyjątek) na górze modułu, którego nie chcesz importować. Jeśli nie faktycznie zaimportować go gdzieś, program wygeneruje traceback i wysiadanie.Odpowiedzi:
Sprawdź nazwę modułu w
sys.modules
słowniku :import sys modulename = 'datetime' if modulename not in sys.modules: print 'You have not imported the {} module'.format(modulename)
Z dokumentacji:
Zauważ, że
import
instrukcja ma dwie rzeczy:sys.modules
), to jest ładowany i dodawany dosys.modules
.Wyrażenie
modulename not in sys.modules
sprawdza, czy miał miejsce krok 1. Testowanie wyniku kroku 2 wymaga znajomości dokładnejimport
instrukcji, która została użyta, ponieważ ustawiają różne nazwy w celu odniesienia do różnych obiektów:import modulename
zestawymodulename = sys.modules['modulename']
import packagename.nestedmodule
zestawypackagename = sys.modules['packagename']
(bez względu na to, ile dodasz dodatkowych poziomów)import modulename as altname
zestawyaltname = sys.module['modulename']
import packagename.nestedmodule as altname
zestawyaltname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
zestawyobjectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
zestawynestedmodulename = sys.modules['packagename.nestedmodulename']
(tylko wtedy, gdy przed tym importem nie było obiektu nazwanegonestedmodulename
wpackagename
przestrzeni nazw, dodatkowa nazwa zagnieżdżonego modułu jest dodawana do przestrzeni nazw pakietu nadrzędnego w tym momencie)from somemodule import objectname as altname
zestawyaltname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
zestawyaltname = sys.modules['packagename.nestedmodulename']
(tylko wtedy, gdy przed tym importem nie było obiektu nazwanegonestedmodulename
wpackagename
przestrzeni nazw, dodatkowa nazwa zagnieżdżonego modułu jest dodawana do przestrzeni nazw pakietu nadrzędnego w tym momencie)Możesz sprawdzić, czy nazwa, do której został przywiązany importowany obiekt, istnieje w danej przestrzeni nazw:
# is this name visible in the current scope: 'importedname' in dir() # or, is this a name in the globals of the current module: 'importedname' in globals() # or, does the name exist in the namespace of another module: 'importedname' in globals(sys.modules['somemodule'])
To tylko mówi ci, że nazwa istnieje (została powiązana), a nie jeśli odnosi się do określonego modułu lub obiektu z tego modułu. Możesz dokładniej przyjrzeć się temu obiektowi lub sprawdzić, czy jest to ten sam obiekt, w którym jest dostępny
sys.modules
, jeśli chcesz wykluczyć, że od tego czasu nazwa została ustawiona na coś zupełnie innego.źródło
numpy
pakietu - czy użycieimport sys
wewnątrz funkcji najlepiej sprawdza, czy została zaimportowana? Przez „najlepszy” mam na myśli wpływ na wydajność, jakimport sys
będzie wtedy nazywany przy każdym wywołaniu funkcji. Dziękujęimport sys
jest to w żaden sposób drogie;sys
zawsze istnieje, domyślnie jest już załadowany. Ale w przypadku pakietu opcjonalnego: po prostu zaimportuj pakiet . WyłapImportError
wyjątek, jeśli pakiet nie jest zainstalowany, i ustaw flagę wskazującą, że zostanie zainstalowany, gdy import się powiedzie. Następnie możesz użyć flagi, aby poinformować o użyciu opcjonalnej zależności.name in sys.modules
Test jest przydatny tylko wtedy, gdy nie chcesz importować .Do zaakceptowanych odpowiedzi sys.modules dodałbym jedno zastrzeżenie, aby zachować ostrożność podczas zmiany nazw modułów podczas importu:
>>> import sys >>> import datetime as dt >>> 'dt' in sys.modules False >>> 'datetime' in sys.modules True
źródło
użyj sys.modules, aby sprawdzić, czy moduł został zaimportowany (używam unicodedata jako przykładu):
>>> import sys >>> 'unicodedata' in sys.modules False >>> import unicodedata >>> 'unicodedata' in sys.modules True
źródło
sys.modules
zawiera wszystkie moduły używane w dowolnym miejscu w bieżącej instancji interpretera, więc pojawia się, jeśli zostanie zaimportowany do dowolnego innego modułu Pythona.dir()
sprawdza, czy nazwa została zdefiniowana w bieżącej przestrzeni nazw.Połączenie dwóch jest bezpieczniejsze niż każde oddzielne i działa, o ile nie zdefiniowałeś
copy
siebie.if ('copy' in sys.modules) and ('copy' in dir()):
źródło
if "sys" not in dir(): print("sys not imported!")
źródło
sys
może być cokolwiek, a nie tylko moduł.