Python: Pluging wx.py.shell.Shell in einen separaten Prozess

Ich möchte eine Shell erstellen, die einen separaten Prozess steuert, den ich mit dem Multiprocessing-Modul erstellt habe. Möglich? Wie?

BEARBEITEN:

Ich habe bereits einen Weg, um Befehle an den sekundären Prozess zu senden: Ich habe eine code.InteractiveConsole in diesem Prozess, und legte es an eine Eingabe-Warteschlange und eine Ausgangswarteschlange, so kann ich die Konsole aus meinem Hauptprozess zu befehlen. Aber ich will es in einer Shell, wahrscheinlich ein wx.py.shell.Shell , also ein Benutzer des Programms könnte es verwenden.

  • Multiprocessing-GUI-Schemata zur Bekämpfung der "Not Responding" -Blockierung
  • Python - Wie passiert globale Variable zu Multiprocessing.Process?
  • Nicht in der Lage, in eine Datei mit Python-Multiprocessing zu schreiben
  • Sellerie: Wie kann man die Anzahl der Aufgaben in der Warteschlange begrenzen und die Fütterung beenden?
  • Python multiprocessing manager list error: [Errno 2] Keine solche Datei oder Verzeichnis
  • Error_callback in multiprocessing.Pool apply_async in Python 2?
  • 2 Solutions collect form web for “Python: Pluging wx.py.shell.Shell in einen separaten Prozess”

    1. Erstellen Sie zuerst die Shell
    2. Entkoppeln Sie die Shell von Ihrer App, indem Sie ihre Einheimischen leer machen
    3. Erstellen Sie Ihren Code String
    4. Kompilieren Sie den Code-String und erhalten Sie ein Code-Objekt
    5. Führen Sie das Codeobjekt in der Shell aus
         Von wx.py.shell importieren Shell
    
         Frm = wx.Frame (keine)
         Sh = Shell (frm)
         Frm.Show ()    
         Sh.interp.locals = {}
         CodeStr = "" "
         Vom Multiprocessing Import Process, Queue
    
         Def f (q):
             Q.put ([42, Keine, "hallo"])
    
         Q = Warteschlange ()   
         P = Prozess (Ziel = f, args = (q,))
         P.start ()
         Print q.get () # druckt "[42, keine, 'hallo']"
         P.join ()
         ""
    
         Code = compile (codeStr, '', 'exec')
         Sh.interp.runcode (code)
    
    

    Hinweis: Der CodeStr, den ich aus dem ersten Poster gestohlen habe, kann hier wegen einiger Beizprobleme nicht arbeiten. Aber der Punkt ist, können Sie Ihren eigenen CodeStr remote in einer Shell ausführen.

    Sie können eine Queue erstellen, die Sie an den separaten Prozess übergeben. Von den Python Docs :

     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() 

    BEISPIEL: In der wx.py.shell.Shell Docs werden die Konstrukturparameter als gegeben gegeben

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

    Ich habe es nicht ausprobiert, aber locals könnten ein Wörterbuch von lokalen Variablen sein, die du an die Shell weitergeben kannst. Also würde ich folgendes versuchen:

     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() 

    Innerhalb der Shell sollten Sie dann in der Lage sein, Ihre Befehle in cmd_queue zu cmd_queue , die dann im übergeordneten Prozess gelesen werden müssen.

    Python ist die beste Programmiersprache der Welt.