Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中导入子模块(不带“exec”)_Python_Python 3.x_Python Import - Fatal编程技术网

如何在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")