Тест на назву модуля у sys.modulesсловнику :
import sys
modulename = 'datetime'
if modulename not in sys.modules:
print 'You have not imported the {} module'.format(modulename)
З документації:
Це словник, який відображає імена модулів до вже завантажених модулів.
Зверніть увагу, що importтвердження робить дві речі:
- якщо модуль ніколи раніше не імпортувався (== відсутній
sys.modules), він завантажується та додається до sys.modules.
- Прив’язати 1 або більше імен у поточному просторі імен, що посилаються на об’єкт модуля, або на об’єкти, які є членами простору імен модуля.
Випробування виразу, modulename not in sys.modulesякщо відбувся крок 1. Тестування результату кроку 2 вимагає знання того, який саме importоператор був використаний, оскільки вони встановлювали різні імена для посилання на різні об’єкти:
import modulename набори modulename = sys.modules['modulename']
import packagename.nestedmoduleнабори packagename = sys.modules['packagename'](незалежно від того, скільки додаткових рівнів ви додали)
import modulename as altname набори altname = sys.module['modulename']
import packagename.nestedmodule as altname набори altname = sys.modules['packagename.nestedmodule']
from somemodule import objectname набори objectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulenameнабори nestedmodulename = sys.modules['packagename.nestedmodulename'](лише тоді, коли до цього імпорту nestedmodulenameв packagenameпросторі імен не було вказано жодного об’єкта, на цей момент до простору імен батьківського пакета додається додаткове ім’я для вкладеного модуля)
from somemodule import objectname as altname набори altname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altnameнабори altname = sys.modules['packagename.nestedmodulename'](лише тоді, коли до цього імпорту nestedmodulenameв packagenameпросторі імен не було вказано жодного об’єкта, на цей момент до простору імен батьківського пакета додається додаткове ім’я для вкладеного модуля)
Ви можете перевірити, чи існує ім'я, до якого прив'язаний імпортований об'єкт, у даному просторі імен:
'importedname' in dir()
'importedname' in globals()
'importedname' in globals(sys.modules['somemodule'])
Це повідомляє лише про те, що ім’я існує (було пов’язане), а не якщо воно стосується конкретного модуля або об’єкта з цього модуля. Ви можете додатково проаналізувати цей об’єкт або перевірити, чи це той самий об’єкт, що й доступний sys.modules, якщо вам потрібно виключити, що з тих пір ім’я було встановлено на щось інше.
raise SystemError()(або інший виняток на ваш вибір) у верхню частину модуля, який ви не хочете імпортувати. Якщо ж на самому справі імпортувати його де - небудь, ваша програма буде кидати відслідковує і вихід.