【问题标题】:Can I make use of an interrupt to print a status while still continue process?我可以在继续进程的同时利用中断打印状态吗?
【发布时间】:2013-09-29 04:12:02
【问题描述】:

在 python 中,是否可以使用 KeyboardInterrupt 或 CTRL+C 来打印状态消息,可能就像打印变量的内容然后继续执行? 还是中断总是会杀死进程?

我想做的一个例子:

def signal_handler(signum, frame):
    global interrupted
    interrupted = True

while true:
   update(V)
   if interrupted:
      print V

【问题讨论】:

    标签: python interrupt


    【解决方案1】:

    这是可以做到的。 signal 库提供了这个功能,它与您的原型设计方式非常相似。

    import signal
    
    interrupted = False
    
    def signal_handler(signum, frame):
        global interrupted
        interrupted = True
    
    signal.signal(signal.SIGINT, signal_handler)
    
    while true:
        update(V)
        if interrupted:
            print V
    

    【讨论】:

    • 使用这个方法,是否可以指定用CTRL+C以外的键来打断?我注意到现在我无法杀死程序,所以我想分配一个不同的键来中断。
    • 有许多控制序列会产生发送到前台程序的信号。 signal 库可让您将处理程序绑定到键盘可以发送的任何信号。也就是说,将 ctrl-C 绑定到您的调试功能后,您仍然可以使用 ctrl-\。这是一个鲜为人知的发送 SIGQUIT 的 kill 命令。它会触发核心转储,如果您正在编程 C 或 C++,这将很有用,但是 w/e。
    【解决方案2】:

    按 ctrl+c 会引发 KeyboardInterrupt。

    捕获 KeyboardInterrupt 并从中打印一条消息,或使用上面的状态变量。

    见:Capture Control-C in Python

    【讨论】:

      【解决方案3】:

      您可以使用信号处理程序来做到这一点:

      import signal
      
      def sigint_handler(signum, frame):
           print "my_variable =", frame.f_locals.get("my_variable", None)
      
      signal.signal(signal.SIGINT, sigint_handler)
      

      现在中断脚本调用处理程序,该处理程序打印变量,将其从当前堆栈帧中取出。然后脚本继续。

      【讨论】:

      • 我问过Kernonnes的同一个问题,:使用这种方法,我可以指定使用CTRL+C以外的键来中断吗?我注意到现在我无法杀死程序,所以我想分配一个不同的键来中断
      • 您不能为 SIGINT 使用其他密钥。当然,您可以使用另一个信号并使用 kill 命令从命令行(假设您使用的是 Linux)发送它。
      猜你喜欢
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 2011-08-20
      • 2011-07-23
      • 1970-01-01
      • 2012-08-30
      • 2016-10-24
      • 1970-01-01
      相关资源
      最近更新 更多