Тест на назву модуля у 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()
(або інший виняток на ваш вибір) у верхню частину модуля, який ви не хочете імпортувати. Якщо ж на самому справі імпортувати його де - небудь, ваша програма буде кидати відслідковує і вихід.