По поводу запуска скрипта из другого - PullRequest
0 голосов
/ 02 декабря 2010

Есть ли способ, с помощью которого я могу запустить скрипт из другого, получая при этом вывод так же быстро, как и сам, выполняя его самостоятельно. Например: Я использую команду 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?

Ответы [ 3 ]

2 голосов
/ 02 декабря 2010
import subprocess
pro = subprocess.Popen('abc.py')

Это гораздо лучший способ работы с другими сценариями входов, выходов и ошибок.

0 голосов
/ 04 декабря 2010

Модуль подпроцесса является опцией, но сложная часть состоит в том, чтобы следовать выводу параллельно с вашим основным циклом gtk, чтобы достичь этой цели, вы должны учитывать платформу, с которой вы работаете, если вы работаете в Linuxможет легко запустить другой поток и использовать gtk.gdk.threads_init для использования потоков в pygtk, но если вы планируете запускать ваше приложение в Windows, вам следует использовать generators и gobject.idle_add .

О виджете используйте gtk.TextBuffer, связанный с 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

Обратите внимание, что кнопка продолжает реагировать даже при параллельном обновлении.

0 голосов
/ 02 декабря 2010

Вы упомянули PyGtk , но вы можете попробовать PyQt и, в частности, QProcess класс, который имеет несколько хороших сигналов, таких как:

  • readyReadStandardError
  • readyReadStandardOutput

Найдите похожий инструмент с PyGtk.

...