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):
- bool: 告诉我们分离进程的启动是否成功
- int: 如果操作成功,给出启动进程的PID
以下是我用于此信息的来源:
- http://doc.qt.io/qt-4.8/qprocess.html#startDetached
- http://pyqt.sourceforge.net/Docs/PyQt4/qprocess.html (due to current failure to load sourceforge properly here is the cached version: http://webcache.googleusercontent.com/search?q=cache:lQ-ixJIbVQQJ:pyqt.sourceforge.net/Docs/PyQt4/qprocess.html+&cd=1&hl=en&ct=clnk&gl=de&client=ubuntu)
出于某种原因,这根本不起作用。以下是我测试过的两种情况:
正在尝试从函数中获取 bool 和 int 值:
res, pid = self.myProcess.startDetached(self.command, self.args)
我收到这个错误:
Traceback (most recent call last):
File "./qprocess_test.py", line 48, in toggleProcess
res, pid = self.myProcess.startDetached(self.command, self.args)
TypeError: 'bool' object is not iterable
这告诉我无法遍历 startDetached() 的 return 值,因此实际上只有一个 SINGLE 值被 returned 和不是两个,因为我在 PyQt4 文档的多段代码中也看到了......
检查 startDetached() 实际上 returns:似乎 returns 只是一个 int,我认为是PID。但是,如果它是 PID,则它不是正确的值(查看 htop 的输出):
val = QProcess.startDetached(self.command, self.args)
# val = 0 (always!)
我了解到 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))
这是上一个问题的后续问题(也是我发布的):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):
- bool: 告诉我们分离进程的启动是否成功
- int: 如果操作成功,给出启动进程的PID
以下是我用于此信息的来源:
- http://doc.qt.io/qt-4.8/qprocess.html#startDetached
- http://pyqt.sourceforge.net/Docs/PyQt4/qprocess.html (due to current failure to load sourceforge properly here is the cached version: http://webcache.googleusercontent.com/search?q=cache:lQ-ixJIbVQQJ:pyqt.sourceforge.net/Docs/PyQt4/qprocess.html+&cd=1&hl=en&ct=clnk&gl=de&client=ubuntu)
出于某种原因,这根本不起作用。以下是我测试过的两种情况:
正在尝试从函数中获取 bool 和 int 值:
res, pid = self.myProcess.startDetached(self.command, self.args)
我收到这个错误:
Traceback (most recent call last): File "./qprocess_test.py", line 48, in toggleProcess res, pid = self.myProcess.startDetached(self.command, self.args) TypeError: 'bool' object is not iterable
这告诉我无法遍历 startDetached() 的 return 值,因此实际上只有一个 SINGLE 值被 returned 和不是两个,因为我在 PyQt4 文档的多段代码中也看到了......
检查 startDetached() 实际上 returns:似乎 returns 只是一个 int,我认为是PID。但是,如果它是 PID,则它不是正确的值(查看 htop 的输出):
val = QProcess.startDetached(self.command, self.args) # val = 0 (always!)
我了解到 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))