我正在编写一个名为 flac2m4a 的python脚本,它调用 ffmpeg 将.flac文件转换为.m4a文件。核心计划是这样的:
cmd = "ffmpeg -i %s -acodec alac %s.m4a" % (sys.argv[1], sys.argv[1][:-5])
os.system(cmd)
我可以使用这样的程序:
./flac2m4a path_to_the_song.flac
但是当我为他们名字中带有特殊字符的歌曲运行它时:
./flac4m4a.py Justin\ Bieber\ -\ Never\ Say\ Never\ -\ The\ Remixes/01\ -\ Never\ Say\ Never\ \(feat.\ Jaden\ Smith\).flac
在linux下,当我按Tab键自动完成时,特殊字符将使用\
进行转义,但是当我从sys.argv[1]
读取它时,它们将被Python转换为普通字符串:
Justin Bieber - Never Say Never - The Remixes/01 - Never Say Never (feat. Jaden Smith).flac
所以我只想知道如何准确地阅读argv[1]
用户输入的内容(使用那些\
)
答案 0 :(得分:6)
虽然可以为shell引用一个字符串,但是你不应该首先使用shell来执行命令,因此不需要引用任何引号。使用subprocess.call()
代替os.system()
:
subprocess.call(["ffmpeg", "-i", sys.argv[1], "-acodec", "alac",
sys.argv[1][:-5] + ".m4a"])
答案 1 :(得分:1)
你真正要求的是不可能的,因为当shell执行解析时,命令行上输入的内容会丢失。 shell解析特殊字符并将结果传递给python。当python获取字符串时,所有特殊字符都已被处理并丢弃。也就是说,这不是bash的错,而是bash(以及大多数其他shell)的设计。
答案 2 :(得分:0)
./ flac4m4a.py Justin \ Bieber \ - \ 从来没有\ Say \ Never \ - \ The \ Remixes / 01 \ - \ Never \ Say \ Never \(feat。\ Jaden \ Smith).flac
上面命令中的'\'用于转义'','('和')',即它等于
./ flac4m4a.py'Justin Bieber - 永不言败 - The Remixes / 01 - Never Say Never(壮举.Jaden Smith).flac'
你的python程序永远看不到它的argv [1]中的'\'。
如果你真的需要在'','('和')'之前加上'\',你可以轻松地将它添加到你的python程序中。