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

Rin*_*ogg 5 python subprocess mplayer raspberry-pi raspbian

我是一个完全的初学者,所以对任何错误表示歉意。这是我在 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")
Run Code Online (Sandbox Code Playgroud)

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

似乎子进程仍在继续,但音乐/声音停止了。它似乎与互联网连接无关,而且如果我等待它也不会再次启动。我尝试过执行 radio.communicate() 或 radio.stdout.read() ,这很有趣,可以让我的收音机连续播放,但不会继续脚本。我没有任何输出,脚本只是有效。

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

Rin*_*ogg 6

幸运的是我自己解决了。subprocess.PIPE 显然停止/干扰了进程,所以我没有像 stdout=subprocess.PIPE 那样完成 DEVNULL :

DEVNULL = open(os.devnull, 'wb')
radiostream = subprocess.Popen(["mplayer", 'http://edge-bauerabsolute-02-gos1.sharp-stream.com/absolute90s.mp3?&'], shell = False, stdout=DEVNULL, stderr=DEVNULL)
Run Code Online (Sandbox Code Playgroud)

  • 传递 `stdout=PIPE` 的作用是允许您接收进程的输出。它进入一个缓冲区,您可以从中读取。它的大小有限,因此如果不相对迅速地从缓冲区中读取数据,那么缓冲区将被填满,并且所有未来的输出将导致进程挂起,直到从缓冲区中读取数据(这会释放空间)。如果您只想隐藏输出,那么您可以传递更可移植的“subprocess.DEVNULL”。 (8认同)