Проблемы с запутанным процессом - PullRequest
2 голосов
/ 08 марта 2012

У меня возникли некоторые проблемы с Twisted, и я запускаю серию процессов, которые выполняют сценарии один за другим и возвращают код завершения.

Чтобы проверить это, я создал пять тестовых сценариев (test1.py, test2.py и т. д.), каждый из которых содержит следующее:

#!/usr/bin/python

a = 1
b = 2
total = a + b

(единственное отличие в файлах - это числа, для которых установлены a и b (чтобы дать сценариям некоторую вариацию)).

Затем у меня есть следующий скрипт, который должен запустить пять тестовых скриптов один за другим, а затем распечатать их коды выхода:

from twisted.internet import glib2reactor
glib2reactor.install()
from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)

import os.path

from twisted.internet import defer, reactor
from twisted.internet.protocol import ProcessProtocol

from ubuntuone.platform.tools import SyncDaemonTool

scriptslocation = "/home/jono/Desktop"

class SubprocessReturnCodeProtocol(ProcessProtocol):      
    def connectionMade(self):
        self.returnCodeDeferred = defer.Deferred()

    def processEnded(self, reason):
        self.returnCodeDeferred.callback(reason.value.exitCode)

    def outReceived(self, data):
        print data

    def errReceived(self, data):
        print data

class ScriptChecker():
    def __init__(self):
        print "init"
        self.run_scripts()

    @defer.inlineCallbacks
    def run_scripts(self):
        print "run scripts"

        accoms = [  { "script" : os.path.join(scriptslocation, "test1.py") },
                    { "script" : os.path.join(scriptslocation, "test2.py") },
                    { "script" : os.path.join(scriptslocation, "test3.py") },
                    { "script" : os.path.join(scriptslocation, "test4.py") },
                    { "script" : os.path.join(scriptslocation, "test5.py") }]

        for accom in accoms:
            print "Running: " + str(accom["script"])
            exitcode = yield self.run_a_subprocess([accom["script"]])
            print "Exit code: " + str(exitcode)

    def run_a_subprocess(self, command):
        pprotocol = SubprocessReturnCodeProtocol()
        reactor.spawnProcess(pprotocol, command[0], command, env=os.environ)        
        return pprotocol.returnCodeDeferred

if __name__ == '__main__':
    s = ScriptChecker()
    DBusGMainLoop(set_as_default=True)
    reactor.run()

К сожалению, я наблюдаю довольно странное поведение.В большинстве случаев не все сценарии запускаются, он застревает на одном из них и не продолжается, а затем время от времени запускает все сценарии, как ожидалось.

Я довольно новичок в Twisted и не уверен, чтопроисходит;есть идеи?

1 Ответ

1 голос
/ 08 марта 2012

Вы импортируете вещь DBus после установки реактора; Я подозреваю, что это вызывает некоторые нежелательные взаимодействия внутри самой GTK, которые могут привести к потере или обработке сигналов неправильным кодом.

Если вы измените верхнюю часть вашего файла на

from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)
from twisted.internet import glib2reactor
glib2reactor.install()

это что-нибудь исправляет?

...