使用使用其他库的已修补和未修补版本的库

时间:2017-07-20 06:43:37

标签: python import monkeypatching grequests

我想这个问题(Import not Working)意味着以下内容,它很有趣:

图书馆A和B实际上是grequest和多处理。 (我听说)grequest patch socket,但多处理不能使用修补版本。

我想使用两个库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()

result(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-?

1 个答案:

答案 0 :(得分:2)

没有两个单独的版本。模块是Python中的单例,它们被加载一次,所有import语句都是绑定名称(第一个这样的语句触发加载)。只有修补的版本&#39;可用。

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

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