用python在子进程上发送命令
我只想在我的raspberry pi上构建一个小python音乐客户端。我安装了“mpg321”,它工作得很好,但现在我的问题。发出命令后用python在子进程上发送命令,python,subprocess,Python,Subprocess,我只想在我的raspberry pi上构建一个小python音乐客户端。我安装了“mpg321”,它工作得很好,但现在我的问题。发出命令后 os.system("mpg321 -R testPlayer") os.system("LOAD test.mp3") python等待用户输入,如播放、暂停或退出。如果我在终端上写下这个,播放器会暂停音乐,然后退出。很好,但是我希望python能够做到这一点,所以我发送了命令 os.system("mpg321 -R testPlayer") os
os.system("mpg321 -R testPlayer")
os.system("LOAD test.mp3")
python等待用户输入,如播放、暂停或退出。如果我在终端上写下这个,播放器会暂停音乐,然后退出。很好,但是我希望python能够做到这一点,所以我发送了命令
os.system("mpg321 -R testPlayer")
os.system("LOAD test.mp3")
其中LOAD是加载此mp3的命令。但什么也没发生。当我通过终端退出播放器时,我得到错误:
sh: 1: LOAD: not found
我想这意味着
os.system("mpg321 -R testPlayer")
完成整个过程,在我退出后,python尝试执行comman加载。那么我如何让这些东西一起工作呢
我的代码:
import os
class PyMusic:
def __init__(self):
print "initial stuff later"
def playFile(self, fileName, directory = ""):
os.system("mpg321 -R testPlayer")
os.system("LOAD test.mp3")
if __name__ == "__main__":
pymusic = PyMusic()
pymusic.playFile("test.mp3")
谢谢你的帮助 您正在寻找将数据发送到
stdin
的方法。下面是一个使用Popen的示例:
from subprocess import Popen, PIPE, STDOUT
p = Popen(['mpg321', '-R testPlayer'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
mpg123_stdout = p.communicate(input='LOAD test.mp3\n')[0]
print(mpg123_stdout)
您建立指向
stdin
和stdout
的指针,然后在启动流程后,与stdin
通信并从stdout
读取。确保发送新行(回车)首先,您几乎不应该使用os.system
。请参阅模块
使用子流程
的一个主要优点是,您可以选择希望在后台运行它的任何行为,启动它并等待它完成(如果它返回非零,则抛出异常),显式地与它的stdin
和stdout
交互,只要有意义
在这里,您不是试图运行另一个命令“LOAD test.mp3”
,而是试图将其作为输入传递给现有进程。因此:
p = subprocess.Popen(['mpg321', '-R', 'testPlayer'], stdin=PIPE)
然后你可以这样做:
p.stdin.write('LOAD test.mp3\n')
这大致相当于从shell执行此操作:
echo -e 'LOAD test.mp3\n' | mpg321 -R testPlayer
但是,您可能应该阅读,因为只要有可能找出如何使代码与通信,它就比尝试处理通用I/O(特别是如果您以前从未使用管道、套接字等进行过编码)简单得多
或者,如果您试图与命令行UI交互(例如,在得到正确提示之前无法发送命令),则可能需要查看“expect”库。其中有一些可供选择,因此您应该为自己找到合适的一个(尽管我可以说我在过去成功地使用过,文档中充满了示例,这些示例比大多数预期的文档要快得多)。+1为简洁起见。我不确定这是否有效,因为我认为他需要等待来自mpg321
的提示-但如果有效,这是迄今为止最简单、最干净的解决方案。谢谢,这非常有效!也谢谢你的提示和信息!