[英]Python, cannot interrupt subprocess with Ctrl-C in windows
我有一些Python代碼可通過子進程調用外部可執行程序,並實時將輸出讀回GUI,我希望隨時使用Ctrl-C中斷外部二進制文件,但似乎不起作用。
我在Windows上工作。 我希望在按Ctrl-C時停止子進程。
這是我的代碼:
class binary_run():
def __init__ (self, tcl_file_name, cmd_str, output_ctrl, exe_cwd):
self.some_exe = "E:\\some.exe"
self.cmd = cmd = self.some_exe + cmd_str
self.output_ctrl = output_ctrl
def PrintOutputInRealTime(self):
#The following two lines are to make sure the console window is hidden
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
#Start the subprocess
process = subprocess.Popen(self.cmd, startupinfo=startupinfo, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
while True:
try:
output = process.stdout.readline()
if output == '' and process.poll() is not None:
break
if output:
self.output_ctrl.write(output)
except KeyboardInterrupt: #Never comes here
process.terminate()
process.terminate()
def run_binary(self):
worker = Thread(target=self.PrintOutputInRealTime)
worker.start()
感謝@JFSebastian,而不是使用KeyboardInterrupt,而是將鍵(Ctrl + Delete)綁定到我的GUI,如果這些鍵被按下,子進程將終止,其工作方式如下:
class binary_run():
def __init__ (self, tcl_file_name, cmd_str, output_ctrl, exe_cwd):
self.some_exe = "E:\\some.exe"
self.cmd = self.some_exe + cmd_str
self.output_ctrl = output_ctrl
self.output_ctrl.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
def PrintOutputInRealTime(self):
#The following two lines are to make sure the console window is hidden
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
#Start the subprocess
self.process = subprocess.Popen(self.cmd, startupinfo=startupinfo, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
while True:
try:
#output = process.stdout.readline()
output = self.process.stdout.readline()
if output == '' and self.process.poll() is not None:
break
if output:
self.output_ctrl.write(output)
except KeyboardInterrupt:
self.process.terminate()
self.process.terminate()
def OnKeyDown(self, event):
controlDown = event.ControlDown()
keycode = event.GetKeyCode()
if (controlDown and keycode == wx.WXK_DELETE):
wx.MessageBox('Binary got interrupted!', 'INFO', wx.OK | wx.ICON_INFORMATION)
self.process.terminate()
def run_binary(self):
worker = Thread(target=self.PrintOutputInRealTime)
worker.start()
我自己有時也遇到類似情況,當時我使用線程來運行可執行文件並讀取其數據。 我用下面的方法解決了這個問題
import threading
import subprocess
import time
class binary_run():
def __init__ (self):
self.some_exe = "notepad.exe"
def PrintOutputInRealTime(self):
self.process = subprocess.Popen(self.some_exe,stdin=subprocess.PIPE, stdout=subprocess.PIPE)
while True:
try:
output = self.process.stdout.readline()
if output == '' and self.process.poll() is not None:
break
if output:
self.output_ctrl.write(output)
except:
pass
def KillProcess(self):
self.process.terminate()
if __name__ == "__main__":
x = binary_run()
worker = threading.Thread(target=x.PrintOutputInRealTime)
worker.start()
try:
while worker.isAlive():
time.sleep(0.5)
except KeyboardInterrupt:
print "Got Interrupt"
x.KillProcess()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.