猴子修补导入这个的模块

时间:2016-05-06 14:29:29

标签: python python-3.x monkeypatching

因此,我有一个具有此功能的Python应用程序,其中程序目录的extensions子目录中的任何类似模块的文件都会在应用程序初始化过程的某个早期点导入。

这看起来像这样(假设这是my_application.py):

def do_init():
    for thefname in glob.iglob(os.path.join(".","extensions","*")):
        SourceFileLoader(os.path.basename(thefname),thefname).load_module()
    #do other init stuff...

if __name__ == "__main__":
    do_init()
    do_cool_things()

现在,我希望能够在该扩展目录中有一个.py文件,如下所示:

import my_application
def my_cool_things():
    print("The original things have been overridden.")
my_application.do_cool_things = my_cool_things

这适用于...... my_application的未来导入。但do_cool_things守卫内的if __name__ == "__main__"号召唤表现出原始行为。为什么会发生这种情况?如何使该调用显示修改后的行为?

1 个答案:

答案 0 :(得分:1)

通过运行名为my_application.py的脚本创建的模块令人惊讶地不是my_application。通过运行脚本创建的模块是__main__。当然,导入名为my_application.py的文件创建的模块将被称为my_application

问题的两个解决方案是将import my_application替换为import __main__import builtins

简单演示:

#x.py
import y
print ("Hello", hello)

#y.py
import __main__
__main__.hello = 'world'

使用Python 3.4.3在Ubuntu 14.04上进行测试:

$ python3 x.py
Hello world
$