【发布时间】: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