【问题标题】:How to interrupt a program while it's running?如何在程序运行时中断程序?
【发布时间】:2013-06-24 19:37:51
【问题描述】:

我编写了一个程序,它读取一个文本文件并为文本文件中的每一行运行一个 .exe。这导致每次运行 .exe 时都会打开一个新的命令行窗口。当前任务完成后,窗口会自行关闭,但问题如下:

如果我在文本文件中有 100 行,这意味着我调用 .exe 文件 100 次。我的问题是如果我想在它已经开始后取消运行,我必须点击红色的“X”来一个接一个地关闭每个窗口。

我想要做的是让某种命令中断正在运行的程序并关闭所有即将到来的窗口或停止 for 循环运行。

是否可以在控制台中写入命令来中断当前正在运行的代码?

使用某种关键事件监听器会更好吗?如果是这样,Python 中是否有任何内置的关键侦听器?我似乎找不到任何东西。这是否意味着我必须安装 Pygame 才能使用按键事件监听器?

也许我应该尝试听命令行并在我手动关闭的一个窗口上检测退出代码,然后结束 for 循环?

【问题讨论】:

  • 你用什么库来创建窗口?
  • 我不是在创建窗口,它们是通过调用 .exe 文件创建的。我用 os.system() 调用它。每个运行的 .exe 都会执行一些进程,并且该进程会写入 windows cmd 特定窗口...
  • 这个.exe程序是什么?你能告诉我们更多关于它的信息吗?
  • 不是真的...这是我工作场所的内部问题。它是一个.exe,接收输入目录和输出目录,在位于输入目录中的文件上运行,显示运行过程,并将一些文件写入输出目录。
  • 基本上,您需要创建线程,但根据您提供给我们的信息,很难告诉您需要做什么。您可以创建一个线程来处理您在控制台中编写的内容,然后杀死其他进程

标签: python windows python-2.7


【解决方案1】:

有几种方法可以解决这个问题。但是几乎你有一个主要问题 - 你需要某种可以切换的标志,以便代码知道它必须停止。例如,如果代码在一个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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多