在python中使用子进程会导致找不到文件

在python中使用子进程会导致找不到文件,python,bash,avconv,Python,Bash,Avconv,我有一个类似“Nena-Nur getraeumt(1982)HD 0815007.mp3”的文件名-我可以在目录中看到它,但是在python子进程中-我的代码说找不到该文件。有没有办法绕过或编码字符串,使其能够找到文件?这是我的代码片段: try: p = subprocess.Popen(["avconv" , "-y" , "-i" , upload_music_file , "-acodec" , "pcm_s16le" , process_file], universal_n

我有一个类似“Nena-Nur getraeumt(1982)HD 0815007.mp3”的文件名-我可以在目录中看到它,但是在python子进程中-我的代码说找不到该文件。有没有办法绕过或编码字符串,使其能够找到文件?这是我的代码片段:

try:
    p = subprocess.Popen(["avconv" , "-y" , "-i" , upload_music_file , "-acodec" , "pcm_s16le" , process_file],  universal_newlines=True, stdout=subprocess.PIPE)
    out, err = p.communicate()
    retcode = p.wait()
except IOError:
    pass
假设upload_music_文件为“Nena-Nur getraeumt(1982)HD 0815007.mp3”,process_文件为“process_music.mp3”

我得到一个错误:

avconv版本0.8.12-6:0.8.12-1,版权(c)2000-2014 Libav开发者 基于2014年6月1日17:03:01和gcc 4.7.2 /音乐/尼娜-努尔·格特劳姆(1982)高清0815007.mp3 :没有这样的文件或目录

我唯一的线索是当尝试从bash获取文件时: -bash:意外标记“(”附近出现语法错误


有没有一种方法可以处理上传的音乐文件字符串以使其正常工作?

因此,通常情况下,当使用
Popen
或类似工具时,您不希望依赖相对路径。由于它存在,我将继续猜测此错误不是打字错误,而是建议您使用绝对路径而不是相对路径,wh非物质文化遗产是一个非常普遍的问题

具体而言,如果您当前以以下方式访问该文件:

Nena - Nur getraeumt (1982) HD 0815007.mp3
我建议将其称为类似于:

/home/user/music/Nena - Nur getraeumt (1982) HD 0815007.mp3
但同样,只有你知道实际的绝对路径

此外,我建议删除文件名中的空格,因为它们比它们的价值要痛苦得多,但这是个人偏好的问题

至于bash错误,这在处理带有特殊字符的文件名时非常常见。您要么用反斜杠转义每个特殊字符,要么将文件名更改为更合理的格式:

Escaped: Nena\ -\ Nur\ getraeumt\ \(1982\)\ HD\ 0815007.mp3
More reasonable: Nena_Nur_getraeumt_1982_HD_0815007.mp3

在我的例子中,如果在使用python时找不到文件,请检查文件名中是否有特殊的非打印字符


从文件名中删除所有回车、换行符和换行符,您可以使用ls-b检查linux上的其他字符,以查看需要转义的内容。

您必须引用文件名,才能将其解释为shell中命令的字符串参数:ls”/music/Nena-Nur getraeumt(1982)HD 0815007.mp3“@PadraicCunningham我假设传递的文件实际上是/music/Nena,因为我不相信我曾经见过/music作为根目录,但我可能完全错了。如果不了解更多关于目录结构的信息,很难进行调试,但我仍然认为这很可能是问题所在。
ls'ing
该文件会导致错误n因为没有转义paren和空格而出错。@PadraicCunningham,也就是说,我刚才说的稍微不那么精细。在Python中使用
子进程时,您不必担心文件名中的特殊字符;Python负责为您引用。@augurar这就是为什么它是一个附录,而不是核心答案。确实如此注意,但在OP的问题下面,注意到了一个bash语法错误,这肯定是由于特殊字符造成的。我发现了问题!文件名上有一个不可见的回车符,我甚至没有看到ls-b或ls-q!