2012-03-07 115 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