Python,mpg123和子进程没有正确使用stdin.write或进行通信

时间:2013-06-18 02:19:55

标签: python subprocess communicate

好的,所以我的google-fu真的很糟糕,我无法找到答案,希望你们大家可以帮助我^ _ ^

好吧,所以我认为是一个简单的脚本似乎没有正确地与其子进程通信,我正在逐行运行。我也在使用mpg123播放器,这是一个Linux系统(好吧,Raspberry Pi)

    from subprocess import Popen, PIPE, STDOUT
    p = Popen(["mpg123", "-C", "test.mp3"], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
    #wait a few seconds to enter this, "q" without a newline is how the controls for the player work to quit out if it were ran like "mpg123 -C test.mp3" on the command line
    p.communicate(input='q')[0]

我可以对它运行stdout.read()就好了,但是使用通信进行输入只是让它挂起而p.stdin.write('q')似乎什么也没做。这是python相关虽然我有一种感觉我也没有在mpg123文档中寻找正确的位置。请善待,因为我对此非常陌生^ _ ^

2 个答案:

答案 0 :(得分:0)

检查mpg123版本理解的参数。以下适用于我的机器:

#!/usr/bin/env python3
import time
from subprocess import Popen, PIPE, DEVNULL, STDOUT

p = Popen(["mpg123", "-K", "test.mp3"], stdin=PIPE, stdout=DEVNULL, stderr=STDOUT)

# wait a little
time.sleep(3)

# send command "Skip song", wait for the player to exit
p.communicate(b'n')[0]

它开始播放文件,等待~3秒,然后退出。

答案 1 :(得分:0)

这是一个糟糕的解决方案,但它在紧要关头起作用。我将它用作补丁是因为出于某种原因,我无法让 Python 库在我的 Raspberry Pi 上正常运行。

如果您以远程模式 (mpg123) 启动 mpg123 -R,您可以更轻松地向其发送命令:

proc = sp.Popen(["mpg123", "-R"], stdin=sp.PIPE)

然后,您可以向其 stdin 属性发送命令。

注意:

  • 命令不同。例如,暂停是 "pause",而不是 " "。在控制台中运行 mpg123 -R,然后向其发送 help 命令以查看命令列表。
  • 命令需要以换行符结束。

来自文档:

<块引用>

-R, --remote

激活通用控制界面。 mpg123 然后将从标准输入读取和执行命令。基本用法是 ''load'' 播放一些文件和明显的 ''pause'', ''command。 ''jump'' 将跳转/寻找给定点(MPEG 帧号)。发出“帮助”以获取完整的命令和语法列表。