포펫 프로세스와 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
을하지만 난 G 객체가는 popen 프로세스가 종료 되더라도 일단 CPU 사이클을 많이 사용하는 것으로 나타났습니다. 위의 스크립트를 실행하고 우분투 시스템 모니터를 시청하십시오.
"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()
질문 I이 있습니다
PTY 좋은 생각인가? Windows에서도 사용할 수 있습니까?
pty를 사용하지 않고 stdout을 사용하는 것이 가능하고 CPU 사용량이 높은 문제가 있습니까?
처음으로이 스크립트를 실행하면 txt 출력을 버퍼링하고 불완전한 출력을 나타내는 것처럼 보입니다.
os.read
와
해결 방법에 대해 좀 더 자세히 설명해 주시겠습니까? 실제로 쉘 = True를 사용하기 때문에 self.proc.kill() 명령이 실제로 프로세스를 죽이지 않는다고 생각됩니다. 가능한? – Fabrizio
무엇이든 가능합니다. –
예를 들어 cmd = 'ls -R /'인 경우이 예제는 실제로 작동하지 않습니다. 그리고 그것과 함께 작동 시키려면 shell = False가 필요할 것입니다. 어떤 경우에는 stop 버튼이 작동하지 않습니다. 결론은 pygtk 프로세스 gui 통신의 위대한 예제가 아닙니다. – Fabrizio