【问题标题】:Hooking Python standard library modules挂钩 Python 标准库模块
【发布时间】:2011-09-22 02:49:37
【问题描述】:

问题

我已经为 Python 编写了一个替换 threading 模块。将标准库中常用的 threading 模块的所有用途与我自己的挂钩的最佳方法是什么?挂钩应该是可选的,并且是基于每个项目或每个可执行文件的。

当这条语句被执行时:

import threading

我希望加载我的模块而不是默认模块。

请注意,将来我还可能会挂钩其他几个标准模块,因此解决挂钩几个模块的解决方案是最好的。

为什么

我已经通过 greenlets 和 Linux 的 eventfd()epoll() 系统调用实现了 IO 并发。除了 sys.modules 钩子和替换 socket 类之外,它可以透明地工作。希望让这种挂钩更好、更一致。

【问题讨论】:

  • 只是一个非冒犯性的问题:为什么?
  • 不,我的意思是你为什么需要替换而不是仅仅在site-packages 将其作为另一个模块?为什么要替换“几个”其他模块?
  • @Matt 你坐在 12.8k 代表上,你还没有学会礼貌?真丢脸。
  • 实际上,我认为 sys.modules hack 可能是最好的方法
  • 您刚刚将问题从“替换 Python 标准库模块”编辑为“挂钩 Python 标准库模块”。我想我下面的答案不是你想要的。那么,从这个意义上说,究竟什么是“挂钩”呢?当你import threading时你需要做什么?

标签: python multithreading import python-3.x


【解决方案1】:

您可以尝试使用 python 的 meta_path 钩子:

http://www.python.org/dev/peps/pep-0302/

它将允许您添加一个可以覆盖部分导入过程的对象。我认为您可以用这种方式将您自己的模块替换为标准模块。我不确定它是否比修补 sys.modules 更好。

【讨论】:

  • 看来sys.modules就好了。
【解决方案2】:

你能不能把你的替换threading 模块放在某个目录中,并在你想使用它时确保该目录在PYTHONPATH 中列出?这应该意味着在导入threading 时会在默认位置之前搜索目录,Python 会找到您的模块并停止。

【讨论】:

  • Ben,知道如果没有自定义线程模块,如何加载 next 线程模块吗?
猜你喜欢
  • 2018-04-03
  • 2020-11-13
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
相关资源
最近更新 更多