gpt4 book ai didi

python - 扭曲的进程执行问题

转载 作者:太空宇宙 更新时间:2023-11-04 06:24:09 25 4
gpt4 key购买 nike

我在使用 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()

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

我是 Twisted 的新手,不确定发生了什么;有什么想法吗?

最佳答案

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

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

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

这能解决任何问题吗?

关于python - 扭曲的进程执行问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9610417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com