【发布时间】:2021-01-27 01:13:55
【问题描述】:
我正在尝试动态导入模块并将其作为全局变量。
我正在使用 maya 2020 python 解释器(Python 2.7)
我在“/home/arda.kutlu/Downloads/”文件夹下有一个名为“trigger_test_script.py”的测试模块。
当我不导入任何自定义类并运行它时:
###########################################################################[START]
import sys
import imp
class TestClass(object):
def __init__(self):
self.filePath = None
self.asName = None
def action(self):
exec("global %s" % self.asName, globals())
foo = "imp.load_source('%s', '/home/arda.kutlu/Downloads/trigger_test_script.py')" %self.asName
cmd = "{0}={1}".format(self.asName, foo)
exec(cmd, globals())
###########################################################################[END]
test = TestClass()
test.filePath = "/home/arda.kutlu/Downloads/trigger_test_script.py"
test.asName = "supposed_to_be_global"
test.action()
print(supposed_to_be_global)
我得到了我想要的确切结果:
<module 'trigger_test_script' from '/home/arda.kutlu/Downloads/trigger_test_script.pyc'>
但是,当我将 TestClass(哈希之间的部分)保存到文件中并像这样导入时:
import testClass
test = testClass.TestClass()
test.filePath = "/home/arda.kutlu/Downloads/trigger_test_script.py"
test.asName = "supposed_to_be_global"
test.action()
print(supposed_to_be_global)
“supposed_to_be_global”的变量没有变成全局变量,我得到了 NameError。
我一直认为这两种用法应该返回相同的结果,但显然我遗漏了一些东西。
感谢任何帮助,谢谢。
【问题讨论】:
-
exec发生在运行它的模块的上下文中。您不应该尝试让您的动态加载器动态设置全局变量,尤其是考虑到您必须告诉它要使用的名称。只需...从action获取模块作为返回值,然后自己分配。 -
问题是因为
globals()返回的值是不同的,当你把TestClass放在一个单独的模块中时——每个模块都有它自己的一组。 -
我很害怕。这个动作类模块将是几个模块之一,它们都有自己的动作方法,产生不同的结果。所有动作都由另一个控制器类驱动,该控制器类也由 ui 类驱动。我需要一个认真的解决方法来解决这个问题。
标签: python python-2.7 import module