首页 > 解决方案 > 动态导入模块作为全局变量

问题描述

我正在尝试动态导入模块并将其作为全局变量。

我正在使用 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。

我一直认为这两种用法应该返回相同的结果,但显然我遗漏了一些东西。

我感谢任何帮助,谢谢。

标签: pythonpython-2.7importmodule

解决方案


我不太明白您关于使用不同action()方法的多个模块的最后评论是一个问题。所以忽略这一点,这里是如何使您的问题中的内容起作用,哈希中的部分将在内联或放入单独的模块中并导入时起作用。

###########################################################################[START]
import imp

class TestClass(object):
    def __init__(self):
        self.filePath = None
        self.asName = None

    def action(self):
        foo = imp.load_source(self.asName, self.filePath)
        return foo
###########################################################################[END]

#from testclass import TestClass

test = TestClass()
test.filePath = "/home/arda.kutlu/Downloads/trigger_test_script.py"
test.asName = "supposed_to_be_global"
supposed_to_be_global = test.action()
print(supposed_to_be_global)

推荐阅读