Subprocess.Popen会在几秒钟后停止(或发生故障)

时间:2018-09-12 13:59:42

标签: python raspberry-pi subprocess raspbian mplayer

我是一个完整的初学者,因此对任何错误表示歉意。这是我在Python 3.5中的代码。它在Raspberry Pi 3上的Raspbian中执行。

import subprocess

radio = subprocess.Popen(["mplayer", 'http://edge-bauerabsolute-02-gos1.sharp-stream.com/absolute90s.mp3?'], shell = False , stdout=subprocess.PIPE)

print ("Other code - no waiting for the subprocess to finish")

收音机播放约30秒钟,然后停止。我希望它在后台运行,而脚本无需等待子进程结束。另外,在Linux中,如果我停止脚本,则无线电会作为mplayer的运行过程再次返回(因此python脚本必须以某种方式将其停止?)

子进程似乎继续,但音乐/声音停止。它似乎与Internet连接无关,如果我等待,它也不会重新启动。我尝试做radio.communicate()或radio.stdout.read(),这很有趣,可以让我的电台连续播放,但不继续执行脚本。我两个都没有输出,脚本只保存了。

问题:当脚本执行其他操作时,如何允许“广播”过程在后台继续(同时播放音乐)?

1 个答案:

答案 0 :(得分:2)

我很幸运自己解决了这个问题。 subprocess.PIPE显然会停止/干扰该进程,因此我不是像stdout = subprocess.PIPE那样执行DEVNULL的:

public class StaticUIVm : PropertyChangeHelper
{
    private ComboBoxDataType _FirstValue;
    public ComboBoxDataType FirstValue
    {
        get { return _FirstValue; }
        set
        {
            _FirstValue = value;
            OnPropertyChanged();
        }
    }

    private ComboBoxDataType _SecondValue { get; set; }
    public ComboBoxDataType SecondValue
    {
        get { return _SecondValue; }
        set
        {
            _SecondValue = value;
            OnPropertyChanged();
        }
    }

    private ComboBoxDataType _SelectedItem;
    public ComboBoxDataType SelectedItem
    {
        get { return _SelectedItem; }
        set
        {
            _SelectedItem = value;
            OnPropertyChanged();
        }
    }

    private int _SelectedIndex;
    public int SelectedIndex
    {
        get { return _SelectedIndex; }
        set
        {
            _SelectedIndex = value;
            OnPropertyChanged();
        }
    }

    public StaticUIVm(string dynamicName)
    {
        FirstValue = new ComboBoxDataType() { id = 1, data = "Some Static Value", display = "Custom Display Text 111", };
        SecondValue = new ComboBoxDataType() { id = 2, data = dynamicName, display = dynamicName, };

        SelectedItem = FirstValue;
        SelectedIndex = 0;
    }
}

public class ComboBoxDataType : PropertyChangeHelper
{
    private long _id { get; set; }
    public long id
    {
        get { return _id; }
        set
        {
            _id = value;
            OnPropertyChanged();
        }
    }

    private string _data { get; set; }
    public string data
    {
        get { return _data; }
        set
        {
            _data = value;
            OnPropertyChanged();
        }
    }

    private string _display { get; set; }
    public string display
    {
        get { return _display; }
        set
        {
            _display = value;
            OnPropertyChanged();
        }
    }
}

public class PropertyChangeHelper : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}