PyQt4 QProcess.startDetached() - 无法获取生成进程的 return 值和 PID

PyQt4 QProcess.startDetached() - can't get return value and PID of spawned process

这是上一个问题的后续问题(也是我发布的):PyQt4 QProcess state always 0, various slots not working too

代码(修改):

主要应用:qprocess_test.py

#!/usr/bin/python

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import QProcess


class Example(QtGui.QWidget):


    def __init__(self):
        super(Example, self).__init__()
        self.command = "./testCommand.py"
        self.args = [""]
        self.initUI()

    def initUI(self):               
        hbox = QtGui.QHBoxLayout()
        hbox.addStretch(1)

        qbtn = QtGui.QPushButton('Start', self)
        qbtn.clicked.connect(self.toggleProcess)
        qbtn.resize(qbtn.sizeHint())
        hbox.addWidget(qbtn)

        # This button is for testing the responsiveness of the GUI after the QProcess has been started
        qbtn2 = QtGui.QPushButton('Click me', self)
        qbtn2.setCheckable(True)
        qbtn2.toggled.connect(self.toggleButton)
        qbtn2.resize(qbtn2.sizeHint())
        hbox.addWidget(qbtn2)

        self.setLayout(hbox)
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('QProcess controlled by a button')    
        self.show()

    def toggleProcess(self):
        res, pid = QProcess.startDetached(self.command, self.args)
            print "Starting process\n", str(res), " | pid = ", str(pid)

    def toggleButton(self, value):
        if value == True:
            print "Lalalala!"
        else:
            print "Didadida!"

def main(): 
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

现在 Start 按钮所做的只是启动分离进程。这个想法是让它是可切换的,并且 stop/start 每当用户基于 PID 与之交互时分离进程。

创建进程使用的应用程序:testCommand.py

#!/usr/bin/env python

while True:
    print "a"

经过一些阅读和谷歌搜索后,我发现 startDetached() 函数 returns 2 在 Python 中的值(在 C++ 中它是一个布尔函数,但它也设置了值它的参数之一——指针 pid):

以下是我用于此信息的来源:

出于某种原因,这根本不起作用。以下是我测试过的两种情况:

我了解到 startDetached() 是一个静态函数,因此以后与创建的进程的任何交互都可以通过它的 pid 来完成,但是调用它的状态 (QProcess.state()) 等是不可能的,因为没有可以与之交互的对象。这个(损坏的)东西现在的工作方式确实是启动一个分离的进程,但由于我没有任何识别它的 PID,我唯一的交互方式是手动查找 testCommand.py 然后通过 kill.

执行适当的信号

有谁知道我在这里做错了什么?我可以学习基础知识并开始使用 C/C++ 进行各种系统调用,但我真的很想实际学习如何使用 PyQt4 和 Python.

谢谢!

编辑

似乎 startDetached() 确实 return 是 True|False。然而,PID 无处可寻...不是官方文档中所读的内容。

函数 startDetached 在 C++ 中重载,它有几个签名。根据提供的参数,它不一定 return 相同。

即使overloading does not exist in Python,你也有类似的东西:

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import QProcess

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)

    command = "./testCommand.py"
    args = [""]

    #"regular" startDetached : give two arguments, get a boolean
    process=QProcess()
    re=process.startDetached("ls",["."])
    print(re)
    print(type(re))

    #"overload" startDetached : give three arguments, get a tuple(boolean,PID)
    process2=QProcess()
    re,pid=process2.startDetached("ls",["."],".")
    print(re,pid)
    print(type(re),type(pid))