Python PIPE zum Öffnen von Standard
Ich versuche etwas sehr ähnlichesEchtzeit-Subprozess. Öffnen über stdout und PIPE
Ich möchte jedoch auch Eingaben an den laufenden Prozess senden.
Wenn ich einen Prozess in einem separaten Thread mit starte
process = subprocess.Popen(cmd,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
Ich kann Eingaben über das Terminal senden.
Wie würde ich Eingaben von einer anderen Quelle wie einer separaten Funktion senden, die nicht im Thread enthalten ist?
Ich kann nicht benutzenPopen.communicate
Da der laufende Prozess niemals beendet wird, versuche ich, in Echtzeit mit dem Programm zu interagieren.
Danke im Voraus.
Hier ist mein vollständiger Code. Ich möchte, dass Eingaben an den Subprozess gesendet werden, wenn auf die Schaltfläche "Senden" 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()