PyQt5.QtCore.Qprocess调用外部程序

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'))
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值