У меня возникли некоторые проблемы с 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 и не уверен, чтопроисходит;есть идеи?