Python 关于从另一个运行脚本
有没有一种方法可以让我在运行另一个脚本的同时,像自己执行脚本一样轻松地获得输出。 例如: 我使用os.popen3命令来执行abc.py,但我无法像执行Python 关于从另一个运行脚本,python,pygtk,Python,Pygtk,有没有一种方法可以让我在运行另一个脚本的同时,像自己执行脚本一样轻松地获得输出。 例如: 我使用os.popen3命令来执行abc.py,但我无法像执行python abc.py那样轻松地从abc.py获取输出;似乎我需要等待os.popen3命令完成: fin, fout, ferr=os.popen3("abc.py") out = fout.read() err = ferr.read() fo.write(out) fe.write(err) print out print err [
python abc.py
那样轻松地从abc.py获取输出;似乎我需要等待os.popen3命令完成:
fin, fout, ferr=os.popen3("abc.py")
out = fout.read()
err = ferr.read()
fo.write(out)
fe.write(err)
print out
print err
[编辑]:fo和fe分别是输出和错误日志的文件句柄
另外,我使用什么小部件来填充pygtk中的输出
import subprocess
pro = subprocess.Popen('abc.py')
是处理其他脚本输入、输出和错误的更好方法。您提到了PyGtk,但您可以尝试PyQt,尤其是QProcess类,它有一些很好的信号,如:
- readyReadStandardError
- readyReadStandardOutput
找一个与PyGtk相似的工具。
< P>子过程模块是选项,但是棘手的部分是跟随输出与GTK的主循环不平行,为了完成这个目标,你必须考虑你正在处理的平台,如果您在linux中,您可以轻松地运行另一个线程并使用gtk.gdk.threads\u init
来使用pygtk中的线程,但是如果您计划在windows上运行应用程序,那么您应该使用生成器和gobject.idle\u add
关于小部件,请使用与gtk.TextView
下面是一个线程示例
import gtk
import subprocess
import threading
gtk.gdk.threads_init()
class FollowProcess(threading.Thread):
def __init__(self, cmd, text_buffer):
self.tb = text_buffer
self.child = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
super(FollowProcess, self).__init__()
def run(self):
while not self.child.poll():
out = self.child.stdout.read(1)
if out != '':
gtk.gdk.threads_enter()
self.tb.insert_at_cursor(out)
gtk.gdk.threads_leave()
def destroy(w, cmd):
cmd.child.terminate()
gtk.main_quit()
i = 0
def click_count(btn):
global i
message.set_text('Calling button %d' %i)
i += 1
other_command = 'python extranger.py'
w = gtk.Window()
w.resize(400, 400)
message = gtk.Label('Nothing')
tb = gtk.TextBuffer()
tv = gtk.TextView(tb)
scroll = gtk.ScrolledWindow()
scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
scroll.add(tv)
box = gtk.VBox()
button = gtk.Button('Active button')
cmd = FollowProcess('python extranger.py', tb)
button.connect('clicked', click_count )
w.connect('destroy', destroy, cmd)
box.pack_start(button, False)
box.pack_start(message, False)
box.pack_start(scroll)
w.add(box)
w.show_all()
cmd.start()
gtk.main()
在extranger.py
import time
import sys
i = 0
while True:
print 'some output %d' % i
sys.stdout.flush() # you need this to see the output
time.sleep(.5)
i += 1
请注意,即使并行更新,按钮仍能响应。但它是否会在不让父脚本等待的情况下引导abc.py的输出?请您稍微详细一点。子流程模块允许您生成新流程,连接到其输入/输出/错误管道,并获取其返回代码。此模块旨在替换其他几个较旧的模块和功能。您的代码中的
fo
和fe
是什么?