在python中发送子进程上的commans

2024-05-15 02:45:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

os.system("mpg321 -R testPlayer")

python等待用户输入,比如play、pause或quit。如果我在我的终端写这个,播放器暂停音乐或退出。太好了,但是我希望python这样做,所以我发送命令

^{pr2}$

其中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")

谢谢你的帮助!在


Tags: test命令self终端音乐osdefload
2条回答

首先,您几乎不应该使用os.system。请参阅subprocess模块。在

使用subprocess的一个主要优点是,您可以选择任何您想在后台运行它的行为,启动它并等待它完成(如果它返回非零则抛出一个异常),显式地与它的stdinstdout进行交互,这是有意义的。在

在这里,您没有试图运行另一个命令"LOAD test.mp3",而是试图将其作为输入传递给现有进程。所以:

p = subprocess.Popen(['mpg321', '-R', 'testPlayer'], stdin=PIPE)

然后你可以这样做:

^{pr2}$

这大致相当于从shell中执行此操作:

echo -e 'LOAD test.mp3\n' | mpg321 -R testPlayer

但是,您可能应该阅读communicate,因为只要有可能找出如何使您的代码与communicate一起工作,它比处理一般I/O要简单得多(特别是如果您以前从未使用管道、套接字等进行过编码)。在

或者,如果您试图与命令行UI交互(例如,在得到正确的提示之前,您不能发送命令),您可能需要查看一个“expect”库。其中有一些可供选择,因此您应该search at PyPI为您找到合适的一个(尽管我可以说,我在过去成功地使用过pexpect,而且文档中有很多示例,它们比大多数expect文档更快地理解这些思想)。在

您正在寻找将数据发送到stdin的方法。下面是一个使用Popen的example of this

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)

建立指向stdinstdout的指针,然后在启动进程之后,与stdin通信并读取{}。确保发送新行(回车)

相关问题 更多 >

    热门问题