2011-08-18 8 views
-1

어제 파이썬 (Passing wxPython objects as multiprocessor arguments)으로 작성한 프로그램의 문제점에 대해 질문했습니다. 필자는 스크립트를 평가하는 함수에 다중 프로세스 프로세스를 사용하여이 문제를 해결할 수있었습니다. 그러나 스크립트가 다른 프로세스에서 실행되기 때문에 출력이 wxPython TextCtrl 윈도우로 제대로 리디렉션되지 않습니다. 그래서, 내 텍스트 창에 쓸 수 있도록 자식 프로세스의 출력을 내 주 프로세스로 지속적으로 리디렉션하는 방법을 찾고 있습니다.다중 프로세스 프로세스의 출력을 논 블로킹 리디렉션

def createprocess(test): 
    q = Queue() 
    q.put(test) 
    p = Process(target=runtest, args=(q,)) 
    p.start() 
    p.join() 
    return q.get() 

이 프로세스의 목표 함수 :

def runtest(q): 
    test = q.get() 
    exec 'import ' + test 
    func=test+'.'+test+'()' 
    ret = eval(func) 
    q.put(ret) 

I이 스레드 (How can I send python multiprocessing Process output to a Tkinter gui)를 발견 출력 리디렉션 방법을 설명

프로세스를 설정하는 기능이다 그러나 child process에서는 평가가 완료된 후에 결과물을받는 것이 문제였다.

+0

왜 이런 식으로 하시겠습니까? 사람들이 "악의적 인 eval"이라고 말할 때 사람들이 말하는 것은 __ 정확한 것입니다. " 이 전체 방법은 잘못되었으며 출력을 리디렉션하면 해결되지 않습니다. – agf

+0

그런 다음 어떤 방법을 사용해야합니까? 제발 내가 파이썬 프로그래밍을 처음 접했을 때 깨달으십시오. – Nait

+1

정확하게 당신이하고있는 것을 분명히하지 않았기 때문에 나는 대답 할 수 없습니다. 이전 질문에 대한 대답으로 제 제안을했습니다. 그냥'testmodule = __import __ (test)'를 시도한 다음'ret = getattr (testmodule, test)()'을 시도 했습니까? 적어도 "eval"보다 좋을 것입니다. 또한 'yield'또는'return'을 사용하는 대신'test'가 결과를 출력하는 이유는 무엇입니까? 함수에서 정보를 출력하는 것은 모든 언어에서 잘못된 것입니다. – agf

답변

1

즉각적인 문제를 해결하려면 두 개를 하나만 사용하는 대신 두 개 사용하는 것이 좋습니다. 그것들을 inqueueoutqueue이라고합시다. 개별 프로세스로부터의 출력과 같은 TextCtrl GUI 요소를 제어하는 ​​방법이어서

def runtest(inqueue,outqueue): 
    test = inqueue.get() 
    module=__import__(test) 
    ret=getattr(module,test)()  
    outqueue.put(ret) 

큰 문제에 관한 것이다. 대답은 당신이하지 않는다는 것입니다. 대신 스레드를 생성하십시오 (다른 프로세스를 생성하려는 경우) outqueue에서 값을받을 수 있으며 (별도의 프로세스와 달리) TextCtrl을 업데이트하십시오. 설정 방법에 대한 예제는 LongRunningTasks 위키를 참조하십시오.

관련 문제