我只想在我的树莓派上建立一个小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")
谢谢你的帮助!在
首先,您几乎不应该使用
os.system
。请参阅subprocess模块。在使用
subprocess
的一个主要优点是,您可以选择任何您想在后台运行它的行为,启动它并等待它完成(如果它返回非零则抛出一个异常),显式地与它的stdin
和stdout
进行交互,这是有意义的。在在这里,您没有试图运行另一个命令
"LOAD test.mp3"
,而是试图将其作为输入传递给现有进程。所以:然后你可以这样做:
^{pr2}$这大致相当于从shell中执行此操作:
但是,您可能应该阅读communicate,因为只要有可能找出如何使您的代码与
communicate
一起工作,它比处理一般I/O要简单得多(特别是如果您以前从未使用管道、套接字等进行过编码)。在或者,如果您试图与命令行UI交互(例如,在得到正确的提示之前,您不能发送命令),您可能需要查看一个“expect”库。其中有一些可供选择,因此您应该search at PyPI为您找到合适的一个(尽管我可以说,我在过去成功地使用过pexpect,而且文档中有很多示例,它们比大多数
expect
文档更快地理解这些思想)。在您正在寻找将数据发送到
stdin
的方法。下面是一个使用Popen的example of this:建立指向}。确保发送新行(回车)
stdin
和stdout
的指针,然后在启动进程之后,与stdin
通信并读取{相关问题 更多 >
编程相关推荐