防止在不更改子模块本身的情况下更改被调用子模块的全局变量?

Prevent global variables of called submodules from being altered without changing the submodul itself?

我正在尝试编写某种包装器来测试 python 模块。 这个包装器模拟一个环境,然后通过 execfile 启动其他 python 模块。 有许多 python 个模块需要测试 (>200)。

在这些模块中有一些硬编码变量,其中包含一些绝对文件路径,这些变量在我的模拟环境中不存在(我也无法创建它们)。这些文件路径是脚本将读入的选项文件的路径。每个模块总是只有一个选项文件,并且这个选项文件的文件路径总是保存在同一个全局变量中(我的意思是:每个模块中的变量名称相同:optionFile).

optionFile = "Path to Option file"

我的想法是,我可以在执行测试模块之前使用现有路径预先设置此全局变量 "optionFile"。但是当然这本身并没有帮助,因为执行的模块在执行时只会用硬编码值覆盖 "optionFile"。

我想知道是否有办法覆盖全局对象的 __setattr__ 函数,这样它就不会对某些变量名执行任何操作,但我的尝试没有成功。您认为这可行吗?您有什么建议吗?

根据我们在这里得到的第一印象,似乎无法更改全局变量 object 的 __setattr__(虽然我不明白为什么不...)

所以答案似乎是"No"。

编辑
这在这里不起作用的原因是没有全局 "globals "-object。相反,每个模块都有自己的 "personal" 命名空间和自己的全局变量。一旦模块被加载,这个命名空间就会被创建。肯定可以更改该全局名称空间 - 但只有在模块已经加载之后(这对我的应用程序场景没有帮助)。感谢 BrenBarn 的澄清。
编辑结束

针对我所描述的具体问题的解决方法是改为更改 Python 的 built-in open-function。

# Keep original pointer to the actual Open-function
realOpen = open

# Overwrite the name of the Open-function to implement own logic
def open(filename, mode='r'):
    if filename.endswith(".opt"):
        print "Rerouting opening command"
        realOpen("myCentralOptionFile.opt","r")

    else:
        realOpen(filename,mode)

注意:此解决方法与标题无关。