2011-08-08 23 views
14

我正在使用非OO方式编写的python 2.x API进行交互,它使用模块全局范围来处理一些内部状态驱动的东西。在不再是单例的情况下需要它,并且修改原始代码(不是我们的)不是我们的选择。获取2个独立的python模块实例

短使用单独的解释器子进程运行的,是没有什么办法可框出的模块和与(从而治疗它作为一个对象)的模块的多个实例交互?

我需要使用该模块来驱动2个不同的设置 - 它并没有内部似乎使用。

声明:请不要这样做。只有在非常奇怪的情况下才能做到这一点 - 并且在做这件事之前尝试以其他方式改变情况。我这样做是为了应付在提问时无法改变的奇数代码 - 不是提供一种扩散更多奇数代码的方法。

+1

的可能的复制[如何在运行时使一个Python模块的副本?](https://stackoverflow.com/questions/11170949/how-to-make-a-copy-of-a-python-module在运行时) – ThorSummoner

+0

@ThorSummoner是的,我认为是这样,有一个非常好的顶级答案。 –

回答

1

我还没有使用它的个人,但它似乎Exocet库可能会有帮助。

+1

我喜欢使用一个库来处理这个问题 - 可能比直接修改sys好得多,而且我总是可以报告/修复错误(如果有的话)。 –

13

刚刚从sys.modules卸下模块:

>>> import sys 
>>> import mod as m1 
>>> m1.x = 1 
>>> del sys.modules['mod'] 
>>> import mod as m2 
>>> m2.x = 2 
>>> m1.x 
1 
+0

这是否会使python中的所有类变得冗余? (因为可以使用模块) – mulllhausen

+0

类和模块都有名称空间,但相似之处在此结束。例如,模块不可调用,所以它们不能替换类。 – phihag

+0

欢呼声。为了我的目的,我想我可以完全没有课程。我通常使用类的唯一原因是扩展基本功能。我想我仍然可以用模块做到这一点,但我只需要根据需要显式调用“子”模块或“父”模块。它稍微考虑了一些努力,但是后来认为被调用的函数在哪里居然有用...... – mulllhausen

3

您可以尝试通过欺骗sys.modules中

import badmodule as badmod1 

import sys 
del sys.modules['badmodule'] 

import badmodule as badmod2 

如果一切正常与否,当然取决于什么不好的模块是做..

0

最简单的方法是制作模块的两个副本并分别导入它们。例如,拿你的模块thingabobber并制作两个副本名为thingabobber1thingabobber2。然后,只需:

import thingabobber1, thingabobber2 

如果这是不可行的,从sys.modules删除模块后最初导入,这样你在第二进口获得的第二个副本。

import sys 

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

这可以通过不同路径导入模块来实现。 也就是说 - 如果在你的sys.path中有两个到模块的不同虚线路径,模块缓存将用不同的符号树,全局变量等创建两个不同的模块实例。

这也可以用于库的多个版本。

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