【问题标题】:How to monkey patch __init__ module in Python?如何在 Python 中修补 __init__ 模块?
【发布时间】:2011-06-20 03:10:39
【问题描述】:

我知道,我知道,它很脏。我想知道是否可以劫持一个Python模块的__init__模块来替换它。

我之所以这么问是因为我需要阻止 django lib 启动它的 init 进程的某些部分,使其与我们的配置一起崩溃。

是的,最好修复 django 库并发回补丁。是的,我正在与作者联系。但现在,我需要快速解决。

【问题讨论】:

  • 根据自己的喜好编辑__init__.py 怎么样?都是纯文本

标签: python django init monkeypatching


【解决方案1】:

劫持导入过程的一种方法是在导入之前的某个时间模拟导入,在另一个模块中,该模块在您要猴子修补的模块之前导入。将任何你想要的东西插入sys.modules,并以模块名称作为键,当需要导入原始模块时,Python 会在sys.modules 中找到一个条目并使用它。如果导入以某种神奇的方式完成,这可能不起作用。

另一方面,您始终可以复制原始项目并根据自己的喜好对其进行修补。

【讨论】:

  • +1 但我没有这样做。我看不出如何正确更换它。如果我在模块字典中设置条目,则无法导入其他子模块,因为我的版本不在同一目录中。
  • 对,我想您可能在导入子模块时遇到问题。您也可以尝试手动导入这些子模块,但我不确定最好的方法。您可以尝试的最后一件事是临时修补任何外部函数/全局变量/等。有问题的模块使用。毕竟,如果模块正在做一些涉及副作用的事情,它可能会调用一些外部函数或修改全局变量。在导入之前进行修补并在之后立即重置猴子补丁,你应该没问题。
【解决方案2】:

您可以只编辑__init__.py 文件。没有什么能阻止你,如果你做得对,就不会发生任何坏事。

【讨论】:

  • 我正要评论这应该是一个答案。 +1
  • -1。我知道我能做到。我做到了。我做了一个补丁并与我的同事分享。但问题不是“你能用这个应用程序解决我的问题吗?”。我的问题是:你能劫持 init 吗?
  • 仅仅因为你可以破解一些东西,并且有一天会得到无法维护的损坏代码
猜你喜欢
  • 2023-02-22
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2014-03-22
相关资源
最近更新 更多