Я хотел бы импортировать подмодуль, не зная его имя заранее,как импортировать подмодуль в Python (без `exec`)
>>> __import__("os.path")
<module 'os' from '/usr/lib/python3.3/os.py'>
Не работает, как и следовало ожидать, возвращение os
, не os.path
,
Я придумал это решение.
def import_submodule(mod, submod):
ns = {}
exec_str = "from %s import %s as submod" % (mod, submod)
exec(exec_str, ns, ns)
return ns["submod"]
Это дает результат:
>>> import_submodule("os", "path")
<module 'posixpath' from '/usr/lib/python3.3/posixpath.py'>
Однако я предпочел бы не использовать Exec(), потому что его довольно плохая практика и кажется ненужным, когда импортные механизмы питоны доступны уже через __import__
, imp
и importlib
модулей ,
Есть ли способ в Python3.x сделать этот вид импорта, хотя вызов функции, а не используя exec()
?
Возможный дубликат [Как динамически загружать класс Python] (http://stackoverflow.com/questions/547829/how-to-dynamically-load-a-python-class) –
Обратите внимание на 'name.split ('.') ', затем цикл для использования' getattr() 'для извлечения 'подобъекта'; '.path' в вашем случае. –
Основываясь на ваших примерах на 'os.path', может привести вас к дикой охоте за гусями, поскольку [это не обязательно работает как другие модули] (http://stackoverflow.com/a/2725195/1222578) – Marius