2011-08-08 3 views
14

비 OO 방식으로 작성된 파이썬 2.x API와 상호 작용하고 있으며 일부 내부 상태 구동 항목에 모듈 전역 범위를 사용합니다. 더 이상 싱글 톤이 아닌 상황에서 필요합니다. 우리 코드가 아닌 원래 코드를 수정하는 것은 옵션이 아닙니다.파이썬 모듈의 분리 된 인스턴스 두 개 가져 오기

별도의 인터프리터로 서브 프로세스 실행을 사용하지 않으면 모듈을 상자에 넣고 모듈의 여러 인스턴스와 상호 작용할 수있는 방법이 있습니까 (따라서이를 객체로 처리)?

모듈을 사용하여 내부적으로 작동하지 않는 두 가지 설정을 구동해야합니다.

면책 조항 : 제발하지 마십시오. 매우 이상한 상황에서만이 작업을 수행하십시오. 이렇게하기 전에 다른 방법으로 상황을 변경하십시오. 나는이 질문을 할 때 바꿀 수없는 이상한 코드에 대처하기 위해 이것을했다. 더 이상한 코드를 확산시킬 방법을 제공하지 않기 위해서였다.

+1

[런타임시 파이썬 모듈을 만드는 방법] 가능한 복제본 (https://stackoverflow.com/questions/11170949/how-to-make-a-copy-of-a-python-module) -at-runtime) – 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

이렇게하면 파이썬의 모든 클래스가 중복됩니까? (모듈을 대신 사용할 수 있기 때문에) – 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에 모듈에 대한 두 개의 다른 점선이있는 경우 모듈 캐시는 다른 심볼 트리, 전역 등으로 모듈의 두 인스턴스를 만듭니다.

라이브러리의 여러 버전을 사용하는 데에도 사용할 수 있습니다.

예외가 잡히지 않도록주의하십시오 (잘못된 기호를 잡으려고 할 때).