谢谢大家看到我的帖子。
首先,以下是我的代码:
import os
print("You can create your own message for alarm.")
user_message = input(">> ")
print("\n<< Sample alarm sound >>")
for time in range(0, 3):
os.system('say ' + user_message) # this code makes sound.
print("\nOkay, The alarm has been set.")
"""
##### My problem is here #####
##### THIS IS NOT STOPPED #####
while True:
try:
os.system('say ' + user_message)
except KeyboardInterrupt:
print("Alarm stopped")
exit(0)
"""
我的问题是 Ctrl + C不起作用!
我尝试更改try
块的位置,并使信号(SIGINT)捕获功能。
但那些也行不通。
我看过https://stackoverflow.com/a/8335212/5247212,https://stackoverflow.com/a/32923070/5247212以及其他几个关于此问题的答案。
我正在使用MAC OS(10.12.3)和python 3.5.2。
答案 0 :(得分:3)
这是预期的行为,因为os.system()
是围绕C函数system()
的薄包装器。如man page中所述,父进程在执行命令期间忽略 SIGINT。为了退出循环,您必须手动检查子进程的退出代码(这也在手册页中提到):
import os
import signal
while True:
code = os.system('sleep 1000')
if code == signal.SIGINT:
print('Awakened')
break
然而,实现相同结果的首选(和更多pythonic)方法是使用subprocess
模块:
import subprocess
while True:
try:
subprocess.run(('sleep', '1000'))
except KeyboardInterrupt:
print('Awakened')
break
您的代码看起来像这样:
import subprocess
print("You can create your own message for alarm.")
user_message = input(">> ")
print("\n<< Sample alarm sound >>")
for time in range(0, 3):
subprocess.run(['say', user_message]) # this code makes sound.
print("\nOkay, The alarm has been set.")
while True:
try:
subprocess.run(['say', user_message])
except KeyBoardInterrupt:
print("Alarm terminated")
exit(0)
作为补充说明,subprocess.run()
仅适用于Python 3.5+。您可以在旧版本的Python中使用subprocess.call()
to achieve the same effect。
答案 1 :(得分:0)
同时赶上&#34; SystemExit&#34;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a data-href="https://example.com" class ="aLink">Link 1</a> <br><br>
<a data-href="https://example.com/something" class ="aLink">Likn 2</a>
答案 2 :(得分:0)
问题似乎是您通过subTopics
调用的子流程捕获了Ctrl + C.这个子流程可以相应地做出反应,可能是通过终止它正在做的事情。如果是这样,os.system
的返回值将不为零。您可以使用它来打破os.system()
循环。
这是一个与我合作的例子(用while
代替say
):
sleep
答案 3 :(得分:0)
如果子进程捕获了Ctrl-C,在这种情况下,最简单的解决方案是检查os.system()的返回值。例如,在我的情况下,如果Ctrl-C停止它,则它返回的值为2,这是SIGINT代码。
import os
while True:
r = os.system(my_job)
if r == 2:
print('Stopped')
break
elif r != 0:
print('Some other error', r)