python - Monkey 修补导入此模块的模块

标签 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。但是 if __name__ == "__main__" 防护内的 do_cool_things 调用表现出了原始行为。为什么会发生这种情况以及如何使该调用表现出修改后的行为?

最佳答案

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

解决您问题的两种方法是将 import my_application 替换为 import __main__importbuiltins

简单演示:

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

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

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

$ python3 x.py
Hello world
$

关于python - Monkey 修补导入此模块的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37074991/

相关文章:

ruby - Monkey 在有限范围内修补内置的 ruby​​ 类

ruby - 如何为 Timecop 修补 File 和 CoreExtensions

Python - 加速 A Star 寻路算法

python - 从大型 MongoDB 读取,写入 JSON

django - apache2 python 3.4.3 ubuntu 错误 wsgi no module named

python - 带有指标 DataFrame 的累积和 pandas DataFrame

python - 计算python中单词中字母之间的距离

python - 从 Python 连接和测试 JDBC 驱动程序

python - Windows:直接检查cp1252

python - 你能在类中添加猴子补丁吗?如果没有,我如何重载一个运算符来为两个不同的类定义加法?