我是一个完整的初学者,因此对任何错误表示歉意。这是我在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(),这很有趣,可以让我的电台连续播放,但不继续执行脚本。我两个都没有输出,脚本只保存了。
问题:当脚本执行其他操作时,如何允许“广播”过程在后台继续(同时播放音乐)?
答案 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));
}
}