通过Python运行终端命令的问题

时间:2013-07-11 02:31:51

标签: python linux bash

我正在开发一个小项目,我需要通过python控制一个控制台播放器。此示例命令在Linux终端上完美运行:

mplayer -loop 0 -playlist <(find "/mnt/music/soundtrack" -type f | egrep -i '(\.mp3|\.wav|\.flac|\.ogg|\.avi|\.flv|\.mpeg|\.mpg)'| sort)

在Python中,我正在做以下事情:

command = """mplayer -loop 0 -playlist <(find "/mnt/music/soundtrack" -type f | egrep -i '(\.mp3|\.wav|\.flac|\.ogg|\.avi|\.flv|\.mpeg|\.mpg)'| sort)""" 
os.system(command)

问题是,当我使用Python尝试它时,它在运行时给我一个错误:

sh: 1: Syntax error: "(" unexpected

我真的很困惑,因为它是完全相同的字符串。为什么第二种方法不起作用?

感谢。

3 个答案:

答案 0 :(得分:3)

您的默认用户shell可能是bash。 Python的os.system命令默认在linux中调用sh

解决方法是使用subprocess.check_call()并传递shell=True作为参数,告诉subprocess使用您的默认用户shell执行。

import subprocess
command = """mplayer -loop 0 -playlist <(find "/mnt/music/soundtrack" -type f | egrep -i '(\.mp3|\.wav|\.flac|\.ogg|\.avi|\.flv|\.mpeg|\.mpg)'| sort)"""
subprocess.check_call(command, shell=True)

答案 1 :(得分:1)

您的python调用'os.system'可能只是使用了与您在终端上使用的shell不同的shell: 的 os.system() execute command under which linux shell?

使用os.system生成的shell可能不支持括号替换。

答案 2 :(得分:0)

import subprocess  
 
COMND=subprocess.Popen('command',shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
COMND_bytes = COMND.stdout.read() + COMND.stderr.read()  
print(COMND_bytes)