如何在用户输入时中断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函数直接管理。