PyQt5.QtCore.Qprocess呼び出し外部プログラム

2464 ワード

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
')[:-1]: print(i) if self.PID == 0: break

注意:1:「*」と表記されているアドレスが注意すべき点2:絶対パスでプログラムを実行できない点も気になります.(方式がペアを使用していない可能性もあります)3:Qprocess()には3つの起動方式があります.
  • 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ウィンドウが除去されないことがわかります.その後PyQt 5を見つけた.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'))