2009-05-14 5 views
1

다중 처리 모듈로 만든 별도의 프로세스를 제어 할 쉘을 만들고 싶습니다. 가능한? 방법?Python : wx.py.shell.Shell을 별도의 프로세스에 연결

EDIT : 그 과정에서 code.InteractiveConsole를 생성하고, 입력 큐 및 출력 큐에 첨부, 그래서 명령 할 수있다 : 이미 보조 처리 명령을 송신하는 방법을 달성

내 주요 프로세스에서 콘솔. 하지만 쉘에 넣고 싶습니다. 아마 wx.py.shell.Shell 이니, 프로그램 사용자가 사용할 수 있습니다.

+0

더 자세히 질문 할 수 있겠습니까? – kcwu

+0

보통 wx.py.shell.Shell을 만들면 명령을 GUI를 실행중인 Python의 현재 프로세스로 보냅니다. 명령을 내가 만든 다른 프로세스로 이동 시키길 원합니다. –

답변

1
  1. 먼저 빈의 지역 주민을하여 응용 프로그램에서 쉘을 분리 쉘
  2. 을 만들
  3. 코드 개체를 실행 코드 객체
  4. 을 코드 문자열을 컴파일
  5. 코드 문자열을 만들고 얻을 셸에서
 
    from wx.py.shell import Shell 

    frm = wx.Frame(None) 
    sh = Shell(frm) 
    frm.Show()  
    sh.interp.locals = {} 
    codeStr = """ 
    from multiprocessing import Process, Queue 

    def f(q): 
     q.put([42, None, 'hello']) 

    q = Queue() 
    p = Process(target=f, args=(q,)) 
    p.start() 
    print q.get() # prints "[42, None, 'hello']" 
    p.join() 
    """ 

    code = compile(codeStr, '', 'exec') 
    sh.interp.runcode(code) 

참고 :첫 번째 포스터에서 훔친 코드 스트립이 일부 산세 문제로 인해 여기에서 작동하지 않을 수 있습니다. 그러나 핵심은 쉘에서 원격으로 자신의 codeStr을 실행할 수 있다는 것입니다.

+0

나는 이해할 수 없다. 내가 원하는 것은 사용자가 파이썬 명령으로 입력 할 수있는 쉘이며, 보조 프로세스로 전송됩니다. 내가 여기에 온거야? 나는 그 코드를 이해하지 못하기 때문에. –

+0

codeStr은 코드 객체를 작성하고 쉘에서 원격으로 실행하는 방법을 보여주는 예제입니다. 다른 프로세스의 쉘에서 명령을 실행하는 것이 필요한 경우 Interpreter 클래스 (Py 패키지의 interpreter.py에 있음)에서 상속하는 사용자 정의 인터프리터 클래스를 만들어야합니다. 사용자 정의 인터프리터에서 코드 객체를 만들기 위해 "source"인수를 사용하고이 코드 객체를 별도의 프로세스에서 실행하도록 runsource 메소드를 덮어 씁니다. 이제 사용자 정의 인터프리터 클래스가 생겼습니다. sh = Shell (frm, InterpClass = yourInterpreter) 이렇게해야합니다. – user110476

+0

나는 아직도 혼란 스럽다. 나는 interpreter.py와 code.py를 방문했다. 'runsource' 만 덮어 쓰면됩니까? 'runcode'는 어떤가? –

0

Queue을 만들어 별도의 프로세스로 전달할 수 있습니다.

from multiprocessing import Process, Queue 

def f(q): 
    q.put([42, None, 'hello']) 

if __name__ == '__main__': 
    q = Queue() 
    p = Process(target=f, args=(q,)) 
    p.start() 
    print q.get() # prints "[42, None, 'hello']" 
    p.join() 

예 : 다음 Python Docs부터 wx.py.shell.Shell Docs에서 constructur 매개 변수는 내가 그것을 시도하지 않은

__init__(self, parent, id, pos, size, style, introText, locals, 
     InterpClass, startupScript, execStartupScript, *args, **kwds) 

으로 주어 지지만, locals 지역 변수의 사전, 당신이 할 수 있습니다 껍질에 전달하십시오. 그래서, 다음을 시도합니다 :

def f(cmd_queue): 
    shell = wx.py.shell.Shell(parent, id, pos, size, style, introText, locals(), 
           ...) 

q = Queue() 
p = Process(target=f, args=(q,)) 
p.start() 

를 쉘 내부, 당신은 그 때 실행되는 부모 프로세스에서 읽을 수 다음이 cmd_queue로 명령을 넣을 수 있어야합니다.

+0

보조 프로세스를 제어하는 ​​셸을 만드는 방법에 대해 좀 더 구체적으로 설명하십시오. –

+0

예제에서 보조 프로세스는 wx 객체 인 셸을 생성합니다. 주 프로세스가 wx.App 및 다른 모든 wx 개체를 생성하더라도 보조 프로세스에서 wx 개체를 만들 수 있다고 생각합니까? –

관련 문제