关于运行anoth的脚本

2024-09-28 21:18:32 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种方法可以让我在运行另一个脚本的同时,像自己执行脚本一样容易地得到输出。 例如: 我用os.popen3操作系统要执行的命令abc.py公司,但无法从获取输出abc.py公司就像我做python 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

[EDIT]:fo和fe分别是输出和错误日志的文件句柄。在

另外,在pygtk中,我使用什么小部件来填充输出?在


Tags: py命令脚本reados公司outwrite
3条回答

您提到了PyGtk,但您可以尝试一下PyQt,尤其是QProcess类,它有一些很好的信号,比如:

  • 标准读取错误
  • readyReadStandardOutput

使用PyGtk寻找类似的工具。

subprocess模块是可选的,但棘手的部分是跟踪输出与gtk的主循环不平行,要实现这个目标,必须考虑您正在处理的平台,如果您在linux中,您可以轻松地运行另一个线程并使用gtk.gdk.threads_init在pygtk中使用线程,但是如果您计划在windows上运行应用程序,那么应该使用生成器gobject.idle_添加

关于小部件,请使用与gtk.TextView关联的gtk.TextBuffer

下面是一个线程示例

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

^{pr2}$

请注意,即使在并行更新的情况下,按钮仍然会响应。

import subprocess
pro = subprocess.Popen('abc.py')

是一种更好的方法来处理其他脚本的输入、输出和错误。

相关问题 更多 >