2012-03-07 78 views
2

我在Twisted中遇到一些问题,并运行一系列执行脚本并一个接一个地执行脚本并返回退出代码的流程。扭曲的流程执行问题

为了验证这一点,我有创建五个测试脚本(test1.py,test2.py等),每个只需要在他们以下几点:

#!/usr/bin/python 

a = 1 
b = 2 
total = a + b 

(在文件中,唯一的区别是数字ab被设置为(给脚本一些变化))。

然后我有以下脚本应该运行的五个测试脚本逐一然后打印他们的退出代码:

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() 

不幸的是我看到了一些非常奇怪的行为。大多数情况下,脚本不会全部运行,并且会停留在其中一个脚本上,并且不会继续,然后每隔一段时间它就会按预期运行所有脚本。

我是相当新的扭曲,不知道发生了什么;有任何想法吗?

+1

该代码似乎基本健全。我无法重现您所描述的问题:五个程序每次都能可靠运行(至少连续尝试十次)。也许特定版本的gtk2或其他相关库中的一个与错误行为有牵连(也就是说,它可能是其中一个特定版本的错误,或者是这些错误中的多个特定版本之间的交互)。 – 2012-03-08 00:43:14

+0

我也有难以重现的问题。 我尽了最大努力试图获得本地运行的东西,您可以在lp上看到:〜jml/+ junk/bacon。我已经运行了好几次(在我的精确机器上),我看不到任何失败。如果你能够制作出最小的,可运行的并且共享你所看到的输出结果,这可能会有所帮助。 – jml 2012-03-08 10:51:02

回答

1

在安装反应器后,您正在导入DBus的东西;我怀疑这会导致GTK本身发生一些不良的交互,这可能会导致信号丢失或由错误的代码处理。

如果你改变你的文件来

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

顶这是否解决什么?

+0

不幸的是,没有。同样的问题。感谢您的帮助,我非常感谢。 – 2012-03-08 01:01:53

+1

在#twisted中对Glyph说话时,他怀疑这可能是Ubuntu Twisted包中的一个错误,因为这里的代码应该可以工作。我会提出一个错误并指出这个问题。 – 2012-03-08 01:14:23

+0

大家好,只是为了让你知道,我在Launchpad上提出了一个关于这个问题的bug:https://bugs.launchpad.net/ubuntu/+source/twisted/+bug/949685 - 谢谢! – 2012-03-08 06:23:03