我正在开发一个小项目,我需要通过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
我真的很困惑,因为它是完全相同的字符串。为什么第二种方法不起作用?
感谢。
答案 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)