Получите 2 изолированных экземпляра модуля python

Я взаимодействую с API-интерфейсом python 2.x, написанным не-OO-способом, он использует модульную глобальную область для некоторого внутреннего состояния. Это необходимо в контексте, где он больше не является одиночным, и изменение исходного кода (а не нашего) не является вариантом.

За исключением использования прогонов подпроцесса отдельных интерпретаторов, есть ли какой-либо способ я могу отключить модули и взаимодействовать с несколькими экземплярами модуля (таким образом, рассматривая его как объект)?

Мне нужно использовать модуль для управления двумя разными настройками, с которыми он не работает.

Отказ от ответственности: Пожалуйста, не делайте этого. Пожалуйста, сделайте это только в очень странной ситуации - и попробуйте изменить ситуацию другими способами, прежде чем делать это. Я сделал это, чтобы справиться с нечетным кодом, который не мог быть изменен во время запроса - не предоставлять способ размножать более странный код.

Ответ 1

Я не использовал его лично, но кажется, что Exocet может помочь.

Ответ 2

Просто удалите модуль из 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

Ответ 3

Вы можете попробовать, запуская sys.modules

import badmodule as badmod1

import sys
del sys.modules['badmodule']

import badmodule as badmod2

Если это работает или нет, конечно, зависит от того, что делает плохой модуль...

Ответ 4

Самый простой способ - сделать две копии модуля и импортировать их отдельно. Например, возьмите свой модуль thingabobber и создайте две копии с именем thingabobber1 и thingabobber2. Тогда просто:

import thingabobber1, thingabobber2

Если это невозможно, удалите модуль из sys.modules после первоначального импорта, чтобы вы получили вторую копию во втором импорте.

import sys

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

Ответ 5

Это может быть достигнуто путем импорта модуля с помощью разных путей. То есть, если в вашем sys.path у вас есть два разных пунктирных маршрута к модулю, кэш модуля создаст два разных экземпляра модуля с разными деревьями символов, глобальными и т.д.

Это можно использовать и для нескольких версий библиотеки.

Остерегайтесь того, что это приведет к исключению исключений (поскольку вы пытаетесь поймать неправильный символ).