如何在不转义字符串的情况下读取argv值?

时间:2011-05-13 16:17:44

标签: python linux

我正在编写一个名为 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]用户输入的内容(使用那些\

3 个答案:

答案 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程序中。