【问题标题】:Python, mpg123 and subprocess not properly using stdin.write or communicatePython、mpg123 和子进程未正确使用 stdin.write 或通信
【发布时间】:2013-06-18 02:19:54
【问题描述】:

好的,所以我的google-fu真的有点糟糕,我找不到答案,希望你们能帮助我^_^

好的,所以我认为一个简单的脚本似乎无法正确地与其子进程通信,我正在逐行运行。我也在用mpg123播放器,这是Linux系统(嗯,树莓派)

    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 文档中找到正确的位置。请善待,因为我对此非常陌生^_^

【问题讨论】:

  • 我不熟悉 mpg123,但 communicate() 会阻塞直到进程终止。这是你所期望的吗?
  • 实际上我只是在寻找一种方法来使用子进程来停止播放 mpg123 大声笑,我担心在这里问是不好的,因为它也与 mpg123 有关。将“q”传递给 mpg123,因为这个阶段应该退出程序,所以如果通信阻塞直到进程终止应该没问题,因为程序无论如何都应该退出
  • 看起来 mpg123 在接受 'q' 时遇到问题,因为它也试图检测终端类型。将p.communicate(...) 调用替换为p.kill(); p.stdout.read() 是否满足您的需求?
  • 这会很好地工作,非常感谢=) 虽然你的回答让我很好奇,“它也在努力检测终端类型”这是什么意思? (最好是“白痴指南......”格式呵呵)你是怎么确定的?
  • 我使用了p.kill(); p.stdout.read() 方法并注意到“无法获取终端属性”这一行,当我直接从命令行运行相同的命令时,该行不存在。谷歌搜索错误显示some version of the source,看起来如果它无法检测到终端,它不会启用它。

标签: python subprocess communicate


【解决方案1】:

检查您的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 秒,然后退出。

【讨论】:

    【解决方案2】:

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

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

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

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

    注意:

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

    来自文档:

    -R,--远程

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

    【讨论】:

      猜你喜欢
      • 2016-01-23
      • 2017-08-10
      • 2014-02-04
      • 2017-07-22
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      相关资源
      最近更新 更多