停止无限循环重复调用os.system

时间:2017-03-09 10:57:46

标签: python python-3.x loops try-catch os.system

谢谢大家看到我的帖子。

首先,以下是我的代码:

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/5247212https://stackoverflow.com/a/32923070/5247212以及其他几个关于此问题的答案。

我正在使用MAC OS(10.12.3)和python 3.5.2。

4 个答案:

答案 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)