Python-ROHR zu popen stdin

Ich bin versucht, etwas sehr ähnlich zu Echtzeit-Teilprozess.Popen, die über stdout und PIPE

Ich will jedoch zum senden von input für den Laufenden Prozess als gut.

Wenn ich einen Prozess starten, in einem separaten thread mit

process = subprocess.Popen(cmd,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

Kann ich senden Eingabe mit dem terminal.

Wie würde ich das senden von Eingaben von einer anderen Quelle, wie separate Funktion nicht in den thread?

Kann ich nicht verwenden Popen.communicate wie der laufende Prozess wird nie abgeschlossen, so wie ich bin versucht Echtzeit-Interaktion mit dem Programm.

Vielen Dank im Voraus.

Hier ist mein vollständiger code, ich bin auf der Suche zum Eingang geschickt, um die subprocoess Prozess, wenn die senden-Schaltfläche geklickt wird.

from Tkinter import *`
from ttk import *`
import subprocess
from threading import Thread

class Example(Frame):

    def __init__(self, parent):
       Frame.__init__(self, parent)   

        self.parent = parent
        self.initUI()


    def initUI(self):    

        self.parent.title("Test Client")
        self.style = Style()
        self.style.theme_use("default")
        self.pack(fill=BOTH, expand=1)

        #Label, doesnt change
        lbl = Label(self, text="Client:")
        lbl.grid(row=0, column=1, sticky=W )

        #when output from client is shown
        global display
        display = Text(self,width=50,height=20)
        display.grid(row=1, column=1, sticky=E+W+N+S)

        #where user input is taken
        global prompt
        prompt = Entry(self,width=50)
        prompt.grid(row=3, column=1, sticky=E+W+N+S)

        #Button that will send input to client
        send = Button(self,text="Send",command=self.send)
        send.grid(row=3, column=2, sticky=N)
        get = Button(self,text="Get",command=self.get)
        get.grid(row=2, column=2, sticky=S)

    def get(self):
        print foo

    def send(self):
        sent = prompt.get()


def MyThread():
     global sent
     sent = 2
     cmd = ['nc', '-l', '-p', '50000']

     process = subprocess.Popen(cmd,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    while True:
        out = process.stdout.read(1)
        if out == '' and process.poll() != None:
            break
        if out != '':
            display.insert(INSERT, out)
            sys.stdout.write(out)
            sys.stdout.flush()

def main():
    root = Tk()
    root.geometry("500x410+300+300")
    app = Example(root)

    thread = Thread(target = MyThread, args=())
    thread.start()

    root.mainloop()

if __name__ == '__main__':
    main()  
Sie sollten in der Lage sein zu verwenden Popen.communicate() für, die, haben Sie tatsächlich versucht? Was passiert, wenn Sie tun?
communicate waits für das Kind bis zum Ende und liest alle seine Ausgaben. Da die "Laufenden Prozess wird nie abgeschlossen", bedeutet dies communicate nie wieder zurückkehren wird. So kann er es nicht verwenden.
sollten Sie nicht wohl nennen GUI von einem hintergrund-thread direkt (es möglicherweise oder möglicherweise nicht arbeiten, zeitweise). Könnte man eine Warteschlange und root.after() an Planer ein Aufruf von GUI-thread. Vermeiden Sie die Verwendung global unnötig, Sie könnte mit Instanz-Variablen, anstatt z.B. self.prompt. Könnten Sie socket, select Module anstatt netcat.
Guter Punkt wäre es einfach mit einer Steckdose, sondern direkt von scripting netcat. (Brauchen Sie vielleicht noch einen separaten thread, service, socket... aber besser als 3-4 threads zum Dienst einen Teilprozess... Und eine ganze Menge einfacher. Und es werden arbeiten auf Systeme mit BSD oder Hobbit netcat statt GNU netcat oder ohne netcat überhaupt. Und so weiter.)

InformationsquelleAutor Mr S | 2013-04-18

Schreibe einen Kommentar