Skip to main content
 首页 » 编程设计

python之扭曲的进程执行问题

2025年05月04日9飞鱼

我在使用 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 的新手,不确定发生了什么;有什么想法吗?

请您参考如下方法:

在安装 react 器之后,您正在导入 DBus 东西;我怀疑这会在 GTK 本身内部引起一些不需要的交互,这可能会导致信号丢失或被错误的代码处理。

如果您将文件的顶部更改为

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

这能解决任何问题吗?