【问题标题】:Stopping subprocess executing in a class停止在类中执行的子进程
【发布时间】:2017-01-28 11:25:28
【问题描述】:

我正在尝试通过 MPlayer 播放一系列音频文件,MPlayer 在 Python 中被归类为子进程。

然后在调用 .stop() 命令时。我希望子进程......好吧......停止执行。

我想要继续发生的重要事情是主线程。我不希望 Python 完全终止。

下面是我目前尝试过的代码。

class Alarm:

    urllib.request.urlretrieve(Settings.news_url, 'news.mp3')

    tts1 = gTTS(text='Good morning' + Settings.name + 'It is ' + str(date.today()), lang='en')
    tts2 = gTTS(text='Here is the latest news from the BBC world service', lang='en')
    tts3 = gTTS(text='The weather for today is ' + Settings.weather_rss.entries[0]['title'].split(' ', 1)[1], lang='en')
    tts4 = gTTS(text='That is all for now. Have a great day!', lang='en')

    tts1.save(Settings.greeting)
    tts2.save(Settings.news_intro)
    tts3.save(Settings.weather_forecast)
    tts4.save(Settings.outtro)


    def play(self):     
        alarmpi = subprocess.call(['mplayer', Settings.greeting, Settings.news_intro, 'news.mp3', Settings.weather_forecast, Settings.outtro]);

    def stop(self):
        alarmpi.kill()

alarm = Alarm()

on = Thread(target=alarm.play)
stop = Thread(target=alarm.stop)
on.start()
time.sleep(5)
stop.start()

但是,当我运行此程序时,我收到一条错误消息,提示未定义 alarmpi。

有没有不同的方法来解决这个问题?

提前致谢。

【问题讨论】:

    标签: python python-3.x raspberry-pi mplayer


    【解决方案1】:

    只需将alarmpi 定义为类的成员,使用self 对象来存储它,这样您就可以在stop 方法中调用它(首先在类构造函数中定义它,这样您可以直接拨打stop,无需先拨打play

    def __init__(self):
        self.alarmpi = None
    
    def play(self):     
        self.alarmpi = subprocess.call(['mplayer', Settings.greeting, Settings.news_intro, 'news.mp3', Settings.weather_forecast, Settings.outtro]);
    
    def stop(self):
        if self.alarmpi:
            self.alarmpi.kill()
            self.alarmpi = None
    

    【讨论】:

    • 感谢您的建议!现在我得到一个属性错误。 AttributeError: 'Alarm' 对象没有属性 'alarmpi''
    • 您确定更改了play 方法吗?因为它在这里对我有用。
    • 啊是的..刚刚重新输入了应用程序,它按预期工作:) 谢谢!
    最近更新 更多