Sprawdź nazwę modułu w sys.modulessł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 importinstrukcja 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.modulessprawdza, czy miał miejsce krok 1. Testowanie wyniku kroku 2 wymaga znajomości dokładnej importinstrukcji, 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.nestedmodulezestawy 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 nestedmodulenamezestawy nestedmodulename = sys.modules['packagename.nestedmodulename'](tylko wtedy, gdy przed tym importem nie było obiektu nazwanego nestedmodulenamew packagenameprzestrzeni 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 altnamezestawy altname = sys.modules['packagename.nestedmodulename'](tylko wtedy, gdy przed tym importem nie było obiektu nazwanego nestedmodulenamew packagenameprzestrzeni 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.