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:
Jest to słownik, który mapuje nazwy modułów na moduły, które zostały już załadowane.
Zauważ, że import
instrukcja ma dwie rzeczy:
- jeśli moduł nigdy wcześniej nie był importowany (== brak w
sys.modules
), to jest ładowany i dodawany do sys.modules
.
- Powiąż 1 lub więcej nazw w bieżącej przestrzeni nazw, które odwołują się do obiektu modułu lub do obiektów, które są elementami członkowskimi przestrzeni nazw modułu.
Wyrażenie modulename not in sys.modules
sprawdza, czy miał miejsce krok 1. Testowanie wyniku kroku 2 wymaga znajomości dokładnej import
instrukcji, która została użyta, ponieważ ustawiają różne nazwy w celu odniesienia do różnych obiektów:
import modulename
zestawy modulename = sys.modules['modulename']
import packagename.nestedmodule
zestawy packagename = sys.modules['packagename']
(bez względu na to, ile dodasz dodatkowych poziomów)
import modulename as altname
zestawy altname = sys.module['modulename']
import packagename.nestedmodule as altname
zestawy altname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
zestawy objectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
zestawy nestedmodulename = sys.modules['packagename.nestedmodulename']
(tylko wtedy, gdy przed tym importem nie było obiektu nazwanego nestedmodulename
w packagename
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
zestawy altname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
zestawy altname = sys.modules['packagename.nestedmodulename']
(tylko wtedy, gdy przed tym importem nie było obiektu nazwanego nestedmodulename
w packagename
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:
'importedname' in dir()
'importedname' in globals()
'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.
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.