用python在子进程上发送命令

用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

我只想在我的raspberry pi上构建一个小python音乐客户端。我安装了“mpg321”,它工作得很好,但现在我的问题。发出命令后

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
的提示-但如果有效,这是迄今为止最简单、最干净的解决方案。谢谢,这非常有效!也谢谢你的提示和信息!