【问题标题】:Importing module in exec-statement in python在python的exec语句中导入模块
【发布时间】:2017-11-12 10:34:59
【问题描述】:

我尝试在 python 中使用 exec("import __ as tmp") 导入模块:

def prepare(self):
    for modName in self._config.modules.keys():
        print(locals())
        exec("import {} as tmp".format(modName))
        print(locals())
        self._moduleInst[modName] = tmp

输出是:

{'modName': 'time', 'self': <pyo.Server.Server object at 0x000001CA17DFB550>}
{'modName': 'time', 'self': <pyo.Server.Server object at 0x000001CA17DFB550>, 'tmp': <module 'time' (built-in)>}

Traceback (most recent call last):
    File "[...]", line 3, in <module>
        startServer(None)
    File "[...]", line 10, in startServer
        server.prepare()
    File "[...]", line 15, in prepare
        self._moduleInst[modName] = tmp
NameError: name 'tmp' is not defined

我得到一个 NameError 异常,导致 python 找不到 tmp。如果我打印出所有局部变量,则定义了 tmp...

有人知道我做错了什么吗?谢谢!

【问题讨论】:

标签: python import exec nameerror


【解决方案1】:

您没有在函数代码中的任何位置声明 tmp 变量:

def prepare(self):
    for modName in self._config.modules.keys():
        print(locals())
        exec("import {} as tmp".format(modName))
        print(locals())
        self._moduleInst[modName] = vars()['tmp']

您的 exec 语句中的 tmp 是一个 字符串。所以我猜你想要做的是:self._moduleInst[modName] = 'tmp',它将字符串 tmp 保存到你的字典中。

【讨论】:

  • 我想保存对导入模块的引用,但在你的解决方案中,我“只”保存了一个字符串,但没有模块引用。
  • 我用这个解决方案解决了临时问题:self._moduleInst[modName] = locals()["tmp"]
  • 如果是这种情况,你应该使用 vars() 来打印字典。我已经更新了我的答案。
【解决方案2】:

抱歉,我似乎无法重现此内容。我的代码:

class foo:
    modules = { 'string' : 0 }

    def prepare(self):
        for modName in self.modules.keys():
            print(locals())
            exec("import {} as tmp".format(modName))
            print(locals())
            self.modl = tmp

somevar = foo()
somevar.prepare()
print(somevar.modl.digits)

输出:

{'modName': 'string', 'self': <__main__.foo instance at 0x7f5c11123128>}
{'tmp': <module 'string' from '/usr/lib/python2.7/string.pyc'>, 'modName': 'string', 'self': <__main__.foo instance at 0x7f5c11123128>}
0123456789

Python 版本的区别?

【讨论】:

  • 我使用 Python 3.6.2 (v3.6.2:5fd33b5)。使用 Python 2.7 我没有问题。也许这是python中的一个错误..?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 2017-10-19
  • 2014-03-04
  • 2023-02-15
  • 2013-05-03
相关资源
最近更新 更多