获取python模块的两个独立实例

获取python模块的两个独立实例,python,Python,我正在与一个以非OO方式编写的Python2.xapi交互,它使用模块全局范围来处理一些内部状态驱动的内容。在不再是单例的环境中需要它,修改原始代码(不是我们的)不是一个选项 除了使用单独解释器的子流程运行外,我是否有任何方法可以将模块框出并与模块的多个实例交互(从而将其视为对象) 我需要使用该模块来驱动2个不同的设置-这在内部似乎不起作用 免责声明:请不要这样做。请仅在非常奇怪的情况下这样做,并在这样做之前尝试以其他方式改变情况。我这样做是为了处理请求时无法更改的奇怪代码,而不是提供一种方法来

我正在与一个以非OO方式编写的Python2.xapi交互,它使用模块全局范围来处理一些内部状态驱动的内容。在不再是单例的环境中需要它,修改原始代码(不是我们的)不是一个选项

除了使用单独解释器的子流程运行外,我是否有任何方法可以将模块框出并与模块的多个实例交互(从而将其视为对象)

我需要使用该模块来驱动2个不同的设置-这在内部似乎不起作用


免责声明:请不要这样做。请仅在非常奇怪的情况下这样做,并在这样做之前尝试以其他方式改变情况。我这样做是为了处理请求时无法更改的奇怪代码,而不是提供一种方法来传播更多奇怪的代码。

只需从以下位置删除模块:


你可以通过愚弄sys.modules来尝试

import badmodule as badmod1

import sys
del sys.modules['badmodule']

import badmodule as badmod2

这是否有效当然取决于坏模块正在做什么…

最简单的方法是制作两个模块副本并分别导入它们。例如,使用您的模块
Thingabbor
,制作两份名为
Thingabbor1
Thingabbor2
的副本。那么就:

import thingabobber1, thingabobber2
如果这不可行,请在最初导入模块后将其从
sys.modules
中删除,以便在第二次导入时获得第二份副本

import sys

import thingabobber as thingabobber1
del sys.modules["thingabobber"]
import thingabobber as thingabobber2

我并没有亲自使用过它,但这个库可能会有所帮助。

这可以通过通过不同的路径导入模块来实现。 也就是说,如果在sys.path中有两条到模块的不同点路由,则模块缓存将创建具有不同符号树、全局等的两个不同模块实例

这也可用于具有库的多个版本


请注意,这将导致无法捕获异常(因为您试图捕获错误的符号)。

我喜欢使用处理此问题的库—可能比直接修补sys要好得多,如果有错误,我可以随时报告/修复。这会使python中的所有类都冗余吗?(因为可以使用模块)类和模块都有名称空间,但相似之处到此为止。例如,模块是不可调用的,因此它们不能替换类。干杯。就我而言,我认为我完全可以不上课。我通常使用类的唯一原因是为了扩展基本功能。我认为我仍然可以使用模块来实现这一点,但我只需要根据需要显式调用“子”模块或“父”模块。这稍微需要更多的思考,但是想想被调用函数的位置是有用的…@mulllhausen,请不要这样做。我这样做是为了处理奇怪的代码,而不是为了提供一种方法来传播更多的奇怪代码。可能是@ThorCaller的复制品是的,我想是的,有一个非常好的答案。
import sys

import thingabobber as thingabobber1
del sys.modules["thingabobber"]
import thingabobber as thingabobber2