【发布时间】:2012-12-22 17:12:18
【问题描述】:
在阅读之前请不要认为它是重复的,有很多关于multithreading 和keyboard interrupt 的问题,但我没有找到任何考虑 os.system 的东西,它看起来很重要。
我有一个 python 脚本,它在工作线程中进行一些外部调用。
如果我按ctrl+c,我希望它退出但看起来主线程忽略了它。
类似这样的:
from threading import Thread
import sys
import os
def run(i):
while True:
os.system("sleep 10")
print i
def main():
threads=[]
try:
for i in range(0, 3):
threads.append(Thread(target=run, args=(i,)))
threads[i].daemon=True
threads[i].start()
for i in range(0, 3):
while True:
threads[i].join(10)
if not threads[i].isAlive():
break
except(KeyboardInterrupt, SystemExit):
sys.exit("Interrupted by ctrl+c\n")
if __name__ == '__main__':
main()
令人惊讶的是,如果我将os.system("sleep 10") 更改为time.sleep(10),它会正常工作。
【问题讨论】:
-
您是否考虑过改用subprocess 模块?
-
不要把它作为一个答案,因为它是一个丑陋的黑客,但对于任何搜索 os.system 导致你的脚本忽略 Ctrl+C 的人,你可以这样做
assert 0 == os.system("sleep 10")。这样,如果进程以 0 以外的任何值退出,则会引发 AssertionError。确实,您最好只使用子进程。
标签: python multithreading os.system keyboardinterrupt