【问题标题】:Python: signal.pause() equivalent on WindowsPython:在 Windows 上等效的 signal.pause()
【发布时间】:2012-04-04 19:29:25
【问题描述】:

我的主应用程序线程产生 2 个线程,我在主线程中捕获 SIGINT 以很好地退出它们。 在 linux 上,我使用的是signal.pause(),它运行良好。

在 Windows 上实现 signal.pause() 的最佳方式是什么?

我丑陋的解决方案是:

my_queue.get(True, averylongtime)

并在我的信号处理程序中的 my_queue 中放入一些东西。请注意,如果我不指定超时,则不会捕获 SIGINT。但我想知道是否有更好的解决方案。

谢谢

【问题讨论】:

  • 你是如何生成 SIGINT 的?如果它只是来自键盘的 +C,那么您可以捕获 KeyboardInterrupt。否则可能会引发 Win32 事件。

标签: python windows signals


【解决方案1】:

我用这个:

#another:
while not self.quit:
    # your code

# main
try:
    # your code
except KeyboardInterrupt:
    another.quit = True
    time.sleep(5) # or wait for threading.enumerate() or similar

如果我想让它更健壮,比如说,也可以在存在错误的情况下退出:

except KeyboardInterrupt:
    another.quit = True
    signal.alarm(5)
    time.sleep(6)

对此的副作用是,您在 except:except Exception, e: 的每个块(这不是您应该做的任何事情/太多)您必须预先添加 except KeyboardInterrupt: raise 以便异常不会“吃掉”。

【讨论】:

  • 您的部分答案不适用于问题所在的 Windows。 signal.alarm 在 Windows 上不可用
  • 和 FWIW @qarma ...我会对类似 signal.alarm 但在 Windows 上工作的东西非常感兴趣
【解决方案2】:

我用它来捕捉 Windows 上的 ctrl-c。如果我正在写入管道或文件或你有什么......我想优雅地退出。下面是一个玩具示例

import signal
import sys

def signal_handler(signal, frame):    
    print('Process Interrupted!\n\a')
    sys.exit(0)

signal.signal(signal.SIGINT,signal_handler)

#Rest of your code

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-28
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    相关资源
    最近更新 更多