PyQt5.QtCore.Qprocess呼び出し外部プログラム
2464 ワード
PyQt5.QtCore.Qprocessの使用呼び出し外部プログラムのすべてのコード:
注意: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()の設定モードは、公式リンク参照ドキュメント:
番外編:プロジェクトに必要なのは、PyQtフレームワーク書き込みインタフェースを使用して外部のプログラムを呼び出し、外部プログラムの出力内容をGUIインタフェースに読み出すことです.以前はpythonのsubprocessを使っていました.Popen()は外部プログラムを呼び出す.ソースコードが起動し、有効になっても問題ありません.pyinstallerをパッケージ化すると、外部プログラムの黒いDOSウィンドウが除去されないことがわかります.その後PyQt 5を見つけた.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つの起動方式があります.
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'))