我编写了一个程序,该程序读取文本文件并为文本文件中的每一行运行 .exe。这会导致每次运行 .exe 时都会打开一个新的命令行窗口。当前任务完成后,窗口会自行关闭,但问题如下:
如果我的文本文件有 100 行,这意味着我调用 .exe 文件 100 次。我的问题是,如果我想在运行开始后取消运行,我必须单击红色“X”来逐个关闭每个窗口。
我想做的是使用某种命令中断正在运行的程序,并关闭所有即将打开的窗口或只是停止 for 循环运行。
是否可以向控制台写入命令来中断当前正在运行的代码?
使用某种按键事件监听器会更好吗?如果是的话,Python 中是否有内置的关键监听器?我似乎找不到任何东西。这是否意味着我必须安装 Pygame 才能使用按键事件监听器?
也许我应该尝试监听命令行并检测我手动关闭的窗口之一上的退出代码,从而结束 for 循环?
最佳答案
有几种方法可以解决这个问题。但几乎你有一个主要问题 - 你需要某种可以切换的标志,以便代码知道它必须停止。例如,如果代码在 while 循环中工作,则应在循环开始时检查标志是否有效,或者标志是否告诉循环停止...
while flag:
# do code
有几种方法可以根据您的需要来实现这种类似标记的操作。我将讨论线程选项。首先,您需要了解线程的工作原理,然后需要塑造脚本,这样您就可以读取文本文件,并将所有行放入队列中,而不是为文本文件的每一行“运行可执行文件” ,那么您将有几个线程从该队列中读取数据,并执行所需的操作(例如运行可执行文件),但您应该使用 Python 来模仿,而不是运行外部可执行文件,该线程应该是守护线程..并且它应该有一个主循环来检查父线程中存在的标志是否打开...
下面是一个例子:
from threading import Thread
from Queue import Queue
import sys
import time
class Performer():
def __init__(self):
self.active = False
self.queue = Queue()
def action(self, line):
pass # your code should be here
def operate(self, text_file, threads=5):
with open(text_file) as f:
for line in f:
self.queue.put(line)
self.active = True
thread_pool = []
for i in range(threads):
t = Thread(target=self.__thread, name=('worker-%d' % i))
t.daemon = True
t.start()
thread_pool.append(t)
while self.active:
try:
if self.queue.empty():
break
except KeyboardInterrupt:
self.active = False
sys.exit('user + keyboard = byebye')
else:
time.sleep(1)
def __thread(self):
while self.active:
if not self.queue.empty():
try:
self.action(self.queue.get())
except Exception:
pass # do something here
关于python - 如何在程序运行时中断它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17340836/