0

我猜这个问题(Import not Working)的含义如下,而且很有趣:

库 A 和 B 实际上是grequest和多处理。(我听说)grequest 修补套接字,但多处理不能使用修补版本。

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

库A.py:

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

库B.py:

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

我的程序.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- ?

4

1 回答 1

2

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

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

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

于 2017-07-20T06:48:45.617 回答