PyQt5.QtCore.Qprocess的使用调用外部程序全部代码:
from PyQt5 import QtCore
def run(self):
# *切换到程序当前路径之后,然后执行cmd命令。直接使用绝对路径不能成功运行
os.chdir(self.PATH)
# 执行的cmd命令
cmd = 'server.exe'
self.process = QtCore.QProcess()
# 将QProcess标准输出和标准错误通道的通道模式设置为mode指定的
#下次start()调用时将使用此模式
self.process.setProcessChannelMode(QtCore.QProcess.MergedChannels)
self.process.start(cmd)
while True:
# *读取标准输出之前必须先waitForReadyRead()
self.process.waitForReadyRead()
output = self.process.readAllStandardOutput()
# *获取的标准输出output数据是QBateArray类型,没有decode方式,需要bytearray转换
output = bytearray(output).decode('gbk')
self.PID = self.process.processId()
if output != '':
for i in output.split('\r\n')[:-1]:
print(i)
if self.PID == 0: break
注意:
1:" * "标注的地址是需要注意的点
2:不能使用绝对路径来运行程序,这一点也比较纳闷。(也可能是方式没有使用对)
3: QProcess()有三种启动方式:
- self.process.start(cmd, [])
特点:非阻塞、一体式
这样的启动方式之启动外部程序启动后,它会随着主程序的退出而退出。 - self.process.startDetached(cmd, [])
特点:分离式
外部程序启动后,当主程序退出时并不退出,而是继续运行 - self.process.start(cmd, [])
特点:阻塞
4:QProcess()方法:
- self.process.kill() // 停止
- self.process.readAllStandardOutput() // 从标准输出通道中读取数据
- self.process.readAllStandardErrot() // 从标准错误通道中读取数据
- self.process.setStandardOutputFile() // 设置输出到的文件,相当于前面的重定向
- -self.process.setStandardErrorFile() // 设置错误到的文件
- read(); readLine() // 读取标准输出
5:下面提供了 setProcessChannelMode() 的设置模式,供参考
官方链接参考文档:
https://doc.qt.io/qtforpython/PySide6/QtCore/QProcess.html#PySide6.QtCore.PySide6.QtCore.QProcess.setProcessChannelMode
番外篇:
项目需要,使用的是PyQt框架写界面调用外部的程序,并且读取外部程序输出内容到GUI界面。
之前是使用 python的subprocess.Popen()来调用外部程序。源代码启动,启用没有什么问题。pyinstaller打包之后,发现外部程序的黑DOS窗口不会去除。后来找到了PyQt5.QtCore.Qprocess这种方式重写
def run(self):
os.chdir(slef.PATH)
cmd = 'server.exe'
p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
self.PID = p.pid
while p.poll() is None:
line = p.stdout.readline()
line = line.strip()
if line:
print(line.decode('gbk'))