Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在用户输入时中断Python程序?_Python_Python 3.x - Fatal编程技术网

如何在用户输入时中断Python程序?

如何在用户输入时中断Python程序?,python,python-3.x,Python,Python 3.x,我正在编写一个以某种标准方式执行的程序,除非用户在终端中输入一些东西,在这种情况下,程序应该改变行为,例如 while True: # do something here def interrupt(user_input): if user_input == "some command": sys.exit(0) # e.g. 如何通过在while循环中没有输入来实现这一点?这里最简单的解释是使用线程 要在Python中实现这一点,可以使用

我正在编写一个以某种标准方式执行的程序,除非用户在终端中输入一些东西,在这种情况下,程序应该改变行为,例如

while True:
    # do something here

def interrupt(user_input):
    if user_input == "some command":
        sys.exit(0) # e.g.

如何通过在while循环中没有输入来实现这一点?

这里最简单的解释是使用线程

要在Python中实现这一点,可以使用多线程。为此,有一个模块

通过在创建线程时设置daemon=True,您的守护进程将在后台运行

下面是一个简单的例子。您的主要逻辑将进入主功能。while True infinite循环侦听用户输入,并在用户输入与本例中的某个预定义值匹配时终止程序

import sys
import threading

def main():
    print('Main program')
    while True:
        pass
        # Rest of main program

main_thread = threading.Thread(name='main program',
                               target=main, daemon=True)
main_thread.start()
while True:
    if input().lower() == 'kill':
        print('Terminating program')
        # Add some possible cleanup code here
        sys.exit(0)
请注意Python文档中关于以下内容的重要信息:

守护进程线程在关闭时突然停止。他们的资源包括 由于打开的文件、数据库事务等可能无法发布 正确地如果你想让你的线程优雅地停下来,就让它们停下来 非守护进程,并使用适当的信号机制,如事件

也就是说,这种方法可能足以满足您的目的。根据您的程序逻辑,如果需要一些清理代码,可以在退出之前完成—因为一旦调用sys.exit0,守护线程将被突然终止

然而,一个更普遍的解决办法是利用

这是一种非常独特的方法,因为我们创建了一个常规的非守护线程,并向其传递一个事件。这一次,我们没有在用户输入时突然退出程序,而是使用事件的内部标志

并行地,主函数不使用while真正的无限循环,而是在设置事件后使用非阻塞来中断循环

与上述daemonic方法相比,这有两个优点:

您可以轻松地拥有多个事件,并根据这些事件让程序以不同的方式运行。您还可以使用阻塞来代替Event.is_set。 任何清理代码都可以由main函数直接管理。
这里最简单的解释是使用线程

要在Python中实现这一点,可以使用多线程。为此,有一个模块

通过在创建线程时设置daemon=True,您的守护进程将在后台运行

下面是一个简单的例子。您的主要逻辑将进入主功能。while True infinite循环侦听用户输入,并在用户输入与本例中的某个预定义值匹配时终止程序

import sys
import threading

def main():
    print('Main program')
    while True:
        pass
        # Rest of main program

main_thread = threading.Thread(name='main program',
                               target=main, daemon=True)
main_thread.start()
while True:
    if input().lower() == 'kill':
        print('Terminating program')
        # Add some possible cleanup code here
        sys.exit(0)
请注意Python文档中关于以下内容的重要信息:

守护进程线程在关闭时突然停止。他们的资源包括 由于打开的文件、数据库事务等可能无法发布 正确地如果你想让你的线程优雅地停下来,就让它们停下来 非守护进程,并使用适当的信号机制,如事件

也就是说,这种方法可能足以满足您的目的。根据您的程序逻辑,如果需要一些清理代码,可以在退出之前完成—因为一旦调用sys.exit0,守护线程将被突然终止

然而,一个更普遍的解决办法是利用

这是一种非常独特的方法,因为我们创建了一个常规的非守护线程,并向其传递一个事件。这一次,我们没有在用户输入时突然退出程序,而是使用事件的内部标志

并行地,主函数不使用while真正的无限循环,而是在设置事件后使用非阻塞来中断循环

与上述daemonic方法相比,这有两个优点:

您可以轻松地拥有多个事件,并根据这些事件让程序以不同的方式运行。您还可以使用阻塞来代替Event.is_set。 任何清理代码都可以由main函数直接管理。