Python Monkey修补导入此模块的模块

Python Monkey修补导入此模块的模块,python,python-3.x,monkeypatching,Python,Python 3.x,Monkeypatching,因此,我有一个Python应用程序,它具有这样的功能:在应用程序初始化过程的某个早期点导入程序目录的extensions子目录中的任何类似模块的文件 这看起来像这样(假设这是my_application.py): 现在,我希望能够在extensions目录中有一个.py文件,它是这样的: import my_application def my_cool_things(): print("The original things have been overridden.") my_app

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

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

现在,我希望能够在extensions目录中有一个.py文件,它是这样的:

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

这很有效。。。对于以后导入的
my_应用程序
。但是
do\u cool\u things
调用内部的
if\uuu name\uuuu==“\uuuu main\uuuu”
保护显示了原始行为。为什么会发生这种情况?我如何使调用显示修改后的行为?

通过运行名为
my\u application.py
的脚本创建的模块出乎意料地不是
my\u application
。通过运行脚本创建的模块是
\uuuu main\uuu
。当然,通过导入名为
my\u application.py
的文件创建的模块将被称为
my\u application

解决此问题的两种解决方案是将
导入我的应用程序
替换为
import\uu main\uuu
导入内置程序

简单演示:

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

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

$python3 x.py
你好,世界
$

这很有效!在这里,我试图通过导入机器展开堆栈来了解模块的功能…:P
#x.py
import y
print ("Hello", hello)
#y.py
import __main__
__main__.hello = 'world'