如何在Python中导入子模块(不带“exec”)
我想在不知道子模块名称的情况下导入子模块如何在Python中导入子模块(不带“exec”),python,python-3.x,python-import,Python,Python 3.x,Python Import,我想在不知道子模块名称的情况下导入子模块 >>\uuuuuuuuuuuuuuuuuuuuu导入(“os.path”) 无法按预期工作,返回的是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["sub
>>\uuuuuuuuuuuuuuuuuuuuu导入(“os.path”)
无法按预期工作,返回的是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导入机制已经通过\uuuuuuuuu
、imp
和importlib
模块可用时,它似乎是不必要的
Python3.x中是否有一种方法可以通过函数调用而不是使用exec()
?使用:
导入导入库
>>>importlib.import\u模块('os.path')
这应该在python2.7+和3.1+中起作用。注意,如果您想这样做:
作为函数调用从导入B导入C,importlib.import\u模块
并不总是起作用,因为B
可能不是一个模块
这是一个使用importlib和getattr的函数
def my_import_from(mod_name, var_name):
import importlib
mod = importlib.import_module(mod_name)
var = getattr(mod, var_name)
return var
因此:
from os.path import dirname as var
可替换为以下内容:
var = my_import_from("os.path", "dirname")
这避免了exec,并允许子模块和模块中定义的任何变量
由于我的问题明确表示导入子模块,@Bakuriu的答案是正确的,但是为了完整性考虑,包括这一点可能会帮助遇到相同问题的其他人。注意name.split('.')
,然后循环使用getattr()
检索“子对象”.path
在您的案例中。基于os.path
的示例可能会让您陷入白费力气的境地,因为@ideasman42:\uuuu import\uu('parentmodule.submodule'))
确实导入了子模块
,但返回了父模块
@MartijnPieters我认为这不应该被视为重复,因为OP明确针对的是python3.3,它有一个更好的答案(即importlib
),而在其他问题的答案中没有引用。将其标记为复制品可能意味着人们仍将使用其他国产解决方案,而不是新的进口机器。在当前版本的python上,您几乎不需要直接调用\uuuuu import\uuuu
。
var = my_import_from("os.path", "dirname")