子进程控制的交互我问与此相关的几个星期前就在这里一个问题: Python, mpg123 and subprocess not properly using stdin.write or communicate蟒蛇2.7 - 与mpg123的
多亏从那里我能够做什么,我需要的时候提供帮助。 (没有打电话给q,但是终止了子过程来停止它)##标题## 现在虽然我似乎陷入了一团糟。
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]
很像之前,我需要这是戒不掉了mpg123的像这将是与它的标准控件(如按“Q”退出,或“ - ”把音量调低,“+ '将音量调高等等),现在我使用上面的代码,这在理论上应该可以工作,并且它可以用类似的程序工作。有谁知道一种方法,我可以使用内置于mpg123中的控件(可通过使用“mpg123 -C whatever.mp3”访问的控件)使用子过程?终止是不够的,因为我将需要控制^ _^
编辑:非常感谢abarnert的惊人的答案=) 好吧,所以新的代码只是一个略有修改版本的abarnert的答案,但mpg123似乎并没有被接受的命令
import os
import pty
import sys
import time
pid, fd = os.forkpty()
if pid:
time.sleep(5)
os.write(fd, 'b') #this should've restarted the file
time.sleep(5)
os.write(fd, 'q') #unfortunately doesn't quit here =(
time.sleep(5) # quits after this is finished executing
else:
os.spawnl(os.P_WAIT, '/usr/bin/mpg123', '-C', 'TEST file.mp3')
是否有理由想要控制'mpg123'播放器,而不是使用Python库(或者甚至绑定'libmpg123')来播放音乐并执行自己的控制? – abarnert
主要是因为我是一个新手哈哈,我看到的与Raspberry Pi(我的特定平台)播放的大部分东西都使用mpg123或mpg321,当我说我希望能够播放mp3通过python使用一个子进程与其中一个球员 – codingNewb
首先,对不起我的过度缩写;它似乎导致你误入歧途。每当我处理POSIX风格的代码时,我都会回复使用像'pid'和'fd'这样的单词,好像每个人都应该理解它们的意思。 'pid'是一个进程ID,而不是父ID,在这种情况下,它是_child_进程ID,因此调用它'parentID'会令人困惑。而'fd'是一个文件描述符(或者,对于真正的老年人文件描述符索引),而不是文件目录。 – abarnert