如何在Python中修改__init__模块的Monkey Patch?

5
我知道,我知道,这很不干净。我想知道是否可能劫持Python模块的__init__模块,并将其替换为您自己的模块。
我之所以问这个问题,是因为我需要阻止django库启动其初始化过程的某些部分,因为它会与我们的配置冲突而导致崩溃。
是的,最好修复django库并发送补丁。是的,我正在与作者联系。但现在,我需要一个快速解决方案。

4
你可以直接编辑 __init__.py 文件,按照你的喜好进行修改。这个文件只是纯文本,不需要解释。 - Rafe Kettler
2个回答

4
一种劫持导入过程的方法是在另一个模块中,在它之前被导入的模块中模拟导入,使用需要monkey-patch的模块名作为key插入任何你想要的东西到sys.modules中。当导入原始模块时,Python会在sys.modules中找到条目并使用它。如果导入以某种神奇的方式进行,则可能无法正常工作。
另一方面,您始终可以复制原始项目并按照您的喜好进行修补。

+1 但我在尝试中失败了。我不知道如何正确地替换它。如果我在模块字典中设置条目,那么我就无法导入其他子模块,因为我的版本不在同一个目录中。 - Bite code
没错,我猜想你可能会遇到导入子模块的问题。你可以尝试手动导入这些子模块,但我不确定最好的方法是什么。最后一件事,你可以尝试临时monkey-patch任何被该模块使用的外部函数/全局变量等。毕竟,如果该模块涉及副作用,那么它可能会调用一些外部函数或修改全局变量。在导入之前刚刚进行补丁,并在之后立即重置monkey-patches,那么你应该没问题了。 - Gintautas Miliauskas

0

您可以直接编辑__init__.py文件。没有任何阻止您这样做,如果您做得正确,就不会发生任何问题。


我正要评论说那应该是一个答案。+1 - user257111
3
-1. 我知道我能做到。而且我做到了。我制作了一个补丁并与我的同事分享。但问题不是“你能用这个应用程序解决我的问题吗?”。我的问题是:你能劫持__init__吗? - Bite code
仅仅因为你能够而去黑客某些东西,最终可能会导致代码破损且难以维护。 - Bob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接