請不要在重讀之前將它看作是重複的,關於multithreading
和keyboard interrupt
有很多問題,但我沒有發現任何考慮os.system,它看起來像是重要。使用os.system()調用的Python線程。主線程不會退出ctrl + c
我有一個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](http://docs.python.org/2/library/subprocess.html)模塊呢? – moooeeeep
不要把這個作爲一個答案,因爲它是一個醜陋的黑客,但對於任何人爲了os.system googleing導致你的腳本忽略Ctrl + C,你可以'assert 0 == os.system(「sleep 10」)'。這樣,如果進程退出0以外的任何內容,將引發一個AssertionError。實際上,你使用子進程可能會更好。 –