私は、オブジェクトを使用してPopenプロセスとGTK GUI間の通信を許可しようとしています。この触発されgobjectとsubprocess.PopenをGTK GUIで通信する
: https://pygabriel.wordpress.com/2009/07/27/redirecting-the-stdout-on-a-gtk-textview/#comment-156
私はこれと似たような実装:
http://hartree.altervista.org/files/command-textview.py
を私はGObjectのは、popenのプロセスが終了しても、いったんCPUサイクルを大量に使用していることに気づきました。上のスクリプトを実行して、Ubuntu System Monitorを見てください。
"PTY" といくつかの仕事の後、私はこの思い付いた:
import gtk,pygtk
import subprocess
import gobject
import pty, os, time
class CommandTextView(gtk.TextView):
def __init__(self):
super(CommandTextView,self).__init__()
self.master, self.slave = pty.openpty()
gobject.io_add_watch(os.fdopen(self.master), gobject.IO_IN, self.write_to_buffer)
self.proc = None
def run(self, w, cmd):
if self.proc == None or self.proc.poll() != None: # poll()=None means still running
self.proc = subprocess.Popen(cmd.split(), shell=True, stdout=self.slave, stderr=self.slave)
def stop(self,w):
if type(self.proc) is subprocess.Popen:
self.proc.kill()
while self.proc.poll() == None:
time.sleep(0.1)
self.proc = None
def write_to_buffer(self, fd, condition):
if condition == gobject.IO_IN:
char = fd.readline()
print 'adding:',char
buf = self.get_buffer()
buf.insert_at_cursor(char)
return True
else:
return False
def test():
win=gtk.Window()
vbox = gtk.VBox(False, 0)
win.set_size_request(300,300)
win.connect('delete-event',lambda w,e : gtk.main_quit())
ctv=CommandTextView()
bt1 = gtk.Button('Run')
bt2 = gtk.Button('Stop')
vbox.pack_start(ctv)
vbox.pack_end(bt2,False,False)
vbox.pack_end(bt1,False,False)
win.add(vbox)
bt1.connect("clicked", ctv.run, 'ls -la')
bt2.connect("clicked", ctv.stop)
win.show_all()
gtk.main()
if __name__=='__main__': test()
私が持っている質問は次のとおりです。
は良いアイデアPTYのですか?それもWindows用に使用できますか?
ptyの使用を避け、stdoutを使用してCPU使用率の問題がないのは可能ですか?
初めてこのスクリプトを実行すると、txt出力をバッファして不完全な出力を出すようです。
がos.read
のヘルプ
もう少し詳しく解答してください。私は実際にself.proc.kill()というコマンドがshell = Trueを使うので実際にはプロセスをkillしないと思われます。可能? – Fabrizio
何かが可能です。 –
この例は、cmd = 'ls -R /'のように実際には動作しないようです。そして、それを使って動作させるには、shell = Falseが必要な場合があります。その場合、停止ボタンは機能しません。要するに、pygtkプロセスのGUIのような素晴らしい例ではない。 – Fabrizio