Python全局导入for循环(最好是Python 3.x)

Rie*_*ics 3 python python-module python-import python-3.x python-3.7

我的代码是这样的:

for module in ["ffmpy","os","sys"]:
    try:
        __import__(module)
    except:
        print("Can't import ["+module+"]")
Run Code Online (Sandbox Code Playgroud)

所以,我想全局导入它,但它似乎没有这样做.在这段代码之后,我有sys.path.insert(0, r"C:\Users\david\Desktop\scripts"),并且python控制台告诉我:NameError: name 'sys' is not defined.我不知道我做错了什么,但你希望这样做.

编辑:这个问题不重复,因为我不只是想从字符串导入,而是从for循环中执行.我基本上想要从一个循环中的字符串全局导入.

And*_*ell 5

我认为问题在于,虽然您已导入库sys但尚未定义该对象sys.

请考虑以下两个示例:

# Doesn't work
__import__('sys')
sys.callstats()
Run Code Online (Sandbox Code Playgroud)

这会引发同样的错误:"name'sys'未定义",而

# Works
sys = __import__('sys')
sys.callstats()
Run Code Online (Sandbox Code Playgroud)

工作良好.

您需要将导入的对象存储在某处.字典似乎合情合理:

import_dict = dict()

for module in ["ffmpy","os","sys"]:
    try:
        import_dict[module] = __import__(module)
    except:
        print("Can't import ["+module+"]")


import_dict['sys'].path.insert(0, r"C:\Users\david\Desktop\scripts")
Run Code Online (Sandbox Code Playgroud)

应该管用.

编辑:

正如@ 9769953在评论中所建议的那样,更好的解决方案是使用:

globals()[module] = __import__(module)
Run Code Online (Sandbox Code Playgroud)

然后允许您像平常一样sys直接访问.

  • 或者,如果你真的想要,使用`globals()[module] = __import __(module)`然后直接使用`sys`和其他,如`sys.path.insert(0,r"C:\ Users\david \桌面\脚本")`. (2认同)