2009-05-14 15 views
1

マルチプロセッシングモジュールで作成した別のプロセスを制御するシェルを作成したいと思います。可能?どうやって?Python:wx.py.shell.Shellを別のプロセスにプラグインする

編集:私はその過程で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は、いくつかの酸洗いの問題のためにここでは機能しないかもしれません。しかし、重要なのは、シェル内で独自のcodeStrをリモートで実行できることです。

+0

わかりません。私が望むのは、ユーザーがPythonコマンドで入力できるシェルであり、セカンダリプロセスに送信されます。これは私がここにいるのですか?私はそのコードのことを理解していないので。 –

+0

codeStrは、コードオブジェクトを作成し、シェル内でリモートで実行する方法を示す例でした。 他のプロセスでシェルからコマンドを実行する必要がある場合は、Interpreterクラス(Pyパッケージのinterpreter.pyにあります)を継承するカスタムインタープリタクラスを作成する必要があります。 カスタムインタープリタでは、 "source"引数を使用してコードオブジェクトを作成し、このコードオブジェクトを別のプロセスで実行するように、runourceメソッドを上書きします。これで、カスタマイズされたインタプリタクラスができました。 sh =シェル(frm、InterpClass = yourInterpreter) これは実行する必要があります。 – user110476

+0

私はまだ混乱しています。私はinterpreter.pyとcode.pyに行きました。 'runsource'を上書きするだけでいいですか? 'runco​​de'はどうですか? –

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パラメータは、私はそれを試していないが、localsは、ローカル変数の辞書であるかもしれない、あなたができる

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

として与えられていますシェルに渡します。だから、私は次のことをしようとするだろう:

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オブジェクトを作成することは可能だと思いますか? –

関連する問題