使用使用另一个库的补丁和非补丁版本的库

Using libraries that use patched and non-patched version of another library

我猜这个问题()的意思如下,有点意思:

库A和B实际上是grequest和多处理。 (听说) grequest patches socket 但是multiprocessing不能用打补丁的版本

我想使用两个库A和B。问题是库A在内部导入库C的补丁版本,但是库B在内部导入库C的非补丁版本。

libraryA.py:

import numpy as np
def f():
    print("patched")
np.array = f

libraryB.py:

import numpy as np
def g():
    return np.array([1,2,3])

my_program.py:

import libraryA
import libraryB
libraryB.g()

结果(python3 my_program.py):

Traceback (most recent call last):
  File "my_program.py", line 3, in <module>
    libraryB.g()
  File ".../test/libraryB.py", line 3, in g
    return np.array([1,2,3])
TypeError: f() takes 0 positional arguments but 1 was given

问题:

libraryB 应该使用 numpy 的非补丁版本,但它使用的是补丁版本,因此 my_program.py 中的 libraryB.g() 中断。如何修复 -this- ?

没有两个单独的版本。模块在 Python 中是 单例 ,它们被加载 一次 并且 import 语句所做的只是绑定名称(使用第一个这样的语句触发加载)。只有补丁 'version' 可用。

解决这个问题的唯一方法是修补或替换修补库以阻止它直接修补并找到使该库工作的不同方法。这在很大程度上取决于补丁库如何实现。

这是 grequest 仍然是一个非常专业的用例的原因之一;它修补了 标准库 ,使得大量依赖标准库以某种方式工作的其他代码不兼容。如果您希望将 grequests 和多处理结合起来,您很可能必须找到一种或另一种方法的替代方法。