2013-07-06 3 views
1

Python 스크립트에 전달 된 인수를 기반으로 가져올 모듈을 내 주요 기능에서 선택하고 싶습니다. 그래서, 나는 'blahX'가 같은 인터페이스의 다른 구현물인데, 하나를 사용하고 있습니다.importlib을 사용하여 모듈을 선택하고 다중 처리 기능에서 사용

또한 multiprocessing 모듈을 사용하여 다른 프로세스로 작업을 전달하려고합니다.

blah = None 

def f(a, b): 
    print blah.f(a,b) 

if __name__ == '__main__': 

    # call importlib.import_module here... 

    a = 1 
    b = 2 
    p = multiprocessing.Process(target=f, args=(a, b)) 
    p.start() 
    p.join() 

문제는 multiprocessing.Process에 전달 된 기능은 내가 주에서 수입 된 모듈을 인식하지 못합니다이다. 내가 import

import blah1 as blah 
#import blah2 as blah 

를 사용하지만 그때는 런타임에 모듈을 선택할 수있는 능력을 잃어 버릴 경우는 다릅니다.

어떻게하면이 디자인을 수정할 수 있습니까?

+0

'ㅋ = __import __ ('ㅋ #') '? –

+0

나는'__import__'을 시도했지만, importlib처럼 행동하는 것 같습니다. – jensph

답변

2

mp.Process(...)을 호출하면 다중 처리 모듈이 Unprocess에서 하위 프로세스를 생성하거나 새 Python 프로세스를 시작하고 호출 모듈을 가져옵니다 (Windows에서). Unix에서는 fork 할 때의 모든 전역 변수가 새로운 하위 프로세스에 의해 복사되기 때문에 현재 코드가 작동합니다.

그러나 Windows에서는 호출 모듈을 가져옵니다. ㅋ의 정의, 예를 들어, 이후

blah = importlib.import_module("math") 

blah의 새로운 정의가 서브 프로세스로 전송되지 않는

if __name__ == '__main__': 

안에 보호된다.

그래서, 당신은 목표 함수 모듈의 이름을 전달할 수는 Windows와 함께 작동하도록하고, importlib.import_module가 호출

import importlib 
import multiprocessing as mp 
blah = None 

def f(a, b, name): 
    blah = importlib.import_module(name) 
    print blah.hypot(a,b) 

if __name__ == '__main__': 
    a = 1 
    b = 2 
    p = mp.Process(target=f, args=(a, b, "math")) 
    p.start() 
    p.join() 
+0

감사합니다. 그리고 네 말이 맞아, 나는 윈도우에서 테스트를했다. 가져온 모듈 'blah'객체가 대신 인수로 전달 될 수 있습니까? 아니면 가져 오기가 대상 함수 내부에서 수행되어야합니까? – jensph

+0

Windows의 경우 'Process .__ init__'[picklable]로 전달 된 모든 객체 (http://docs.python.org/2/library/multiprocessing.html#windows). 다음은 [picklable 인 Python 객체 목록]입니다 (http://docs.python.org/2/library/pickle.html#what-can-be-pickled-and-unpickled). 모듈은 picklable이 아니므로 모듈 자체를 전달할 수 없습니다. – unutbu

+0

좋은 지적. 감사. – jensph

관련 문제