Я хотел бы импортировать подмодуль, не зная заранее его имени,
>>> __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 (), потому что это довольно плохая практика и кажется ненужным, когда механизмы импорта Pythons доступны уже через модули __import__
, imp
и importlib
.
Есть ли в Python3.x способ выполнить такой импорт через вызов функции, а не с помощью exec()
?
name.split('.')
, then для использованияgetattr()
для получения «подобъекта»;.path
в вашем случае. - person Martijn Pieters   schedule 27.09.2013os.path
может привести вас к погоне за диким гусям, поскольку он не обязательно работает, как другие модули - person Marius   schedule 27.09.2013__init__.py
(что довольно часто). Суть моего вопроса заключается в том, чтобы эта работа работала точно так же, какfrom A import B as C
. - person ideasman42   schedule 27.09.2013__import__('parentmodule.submodule')
выполняет импортsubmodule
, но возвращаетparentmodule
. - person Martijn Pieters   schedule 27.09.2013my_import = lambda mod: (__import__(mod), __import__('sys').modules[mod])[1]
- person ideasman42   schedule 27.09.2013.
и используйте все, кроме первого элемента в цикле сgetattr()
. - person Martijn Pieters   schedule 27.09.2013importlib
), который не цитируется в ответах на другой вопрос. Отметка этого как дубликата может означать, что люди по-прежнему будут использовать другие самодельные решения вместо нового импортного оборудования. В текущих версиях python вам почти никогда не нужно вызывать__import__
напрямую. - person Bakuriu   schedule 27.09.2013importlib.import_module()
. - person Martijn Pieters   schedule 27.09.2013