我想这个问题(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-?
答案 0 :(得分:2)
没有两个单独的版本。模块是Python中的单例,它们被加载一次,所有import
语句都是绑定名称(第一个这样的语句触发加载)。只有修补的版本&#39;可用。
解决此问题的唯一方法是修补或替换修补库,以阻止其直接修补并找到使该库工作的不同方法。它在很大程度上取决于修补库如何实现。
这是grequest仍然是一个非常专业的用例的一个原因;它修补了标准库,使得依赖标准库的大量其他代码以某种方式工作而不兼容。如果您希望将问候和多处理结合起来,那么您更有可能必须找到一种或另一种方法的替代方案。