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.

  • Hang in Python-Skript mit SQLAlchemy und Multiprocessing
  • Importieren und Verwenden eines Moduls, das Multiprocessing verwendet, ohne eine unendliche Schleife unter Windows zu verursachen
  • Aufruf Multiprocessing in der Klasse Methode Python
  • Python Multiprocessing - Anwenden der Klassenmethode auf eine Liste von Objekten
  • Kombinieren von Itertools und Multiprocessing?
  • Kann ich einen ProcessPoolExecutor aus einer Zukunft nutzen?
  • 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.