我需要使用ctrl c。
从time.sleep()中断While 1:
time.sleep(60)
在上面的代码中,当控件进入time.sleep函数时,python需要经过整整60秒来处理CTRL C
有没有优雅的方法来做到这一点。这样我即使控制时间也可以中断。睡眠功能
修改
我正在使用Windows 2000上使用python 2.2的遗留实现测试它,这导致了所有麻烦。如果我使用了更高版本的python CTRL C会中断sleep()。我通过在for循环中调用sleep(1)来快速破解。这暂时解决了我的问题
答案 0 :(得分:79)
正确答案是使用python stdlib的threading.Event
当然你可以调整你的睡眠间隔,这样你就可以在很短的时间内睡觉,但如果实际想要每60秒运行一次你的循环怎么办?然后你需要做更多的工作来确定是时候跑步还是继续睡觉。此外,你仍然在技术上阻止,但只是很短的时间。与threading.Event
对比:
#!/usr/bin/env python2.7
from threading import Event
exit = Event()
def main():
while not exit.is_set():
do_my_thing()
exit.wait(60)
print("All done!")
# perform any cleanup here
def quit(signo, _frame):
print("Interrupted by %d, shutting down" % signo)
exit.set()
if __name__ == '__main__':
import signal
for sig in ('TERM', 'HUP', 'INT'):
signal.signal(getattr(signal, 'SIG'+sig), quit);
main()
当信号处理程序调用{{1}}时,主线程的exit.set()
调用将立即中断。
现在,您可以使用wait()
表示还有更多工作要做,等等。但在这种情况下,它会作为我们想要退出的方便指标(例如Event
部分。)
您还可以选择在while not exit.is_set()
循环后放置任何清理代码。
答案 1 :(得分:11)
当用户按下中断键Ctrl-C时,会引发KeyboardInterrupt异常。在python中,这是从SIGINT信号转换而来的。这意味着,您可以使用信号模块来处理它:
import signal
def handler(signum, frame):
print "do whatever, like call thread.interrupt_main()"
signal.signal(signal.SIGINT, handler)
while 1:
time.sleep(forever)
这样,你可以在收到键盘中断时做任何你想做的事。
答案 2 :(得分:9)
不确定这段代码是什么意思 - 但如果有必要,请使用较短的sleep()间隔并在其周围放置一个for循环:
for i in range(60):
sleep(1)
使用try..except捕获 KeyboardInterrupt 异常是直截了当的
答案 3 :(得分:2)
我在Linux下使用python版本2.5,2.6,3尝试了你的代码,并且在按下CTRL-C时抛出了“KeyboardInterrupt”异常。
也许某些异常处理会捕获中断,或者您的问题是这样的: Why is KeyboardInterrupt not working in python?
答案 4 :(得分:0)
想到我会把它扔进去。
<repository>
<id>archetype</id>
<name>archetype_company_repo</name>
<url>http://your.company.com/nexus/content/repositories/releases/</url>
</repository>