【问题标题】:Using subprocess in python results in file not found [duplicate]在python中使用子进程导致找不到文件[重复]
【发布时间】:2014-12-29 23:30:04
【问题描述】:

我有一个类似“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_file 是“Nena - Nur getraeumt (1982) HD 0815007.mp3”并且 process_file 是“proccess_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 /music/Nena - Nur getraeumt (1982) HD 0815007.mp3 : 没有这样的文件或目录

我唯一的线索是当尝试从 bash 获取文件时: -bash:意外标记 `('

附近的语法错误

有没有办法处理 upload_music_file 字符串以便它可以工作?

【问题讨论】:

  • 您必须引用文件名才能将其解释为 shell 中命令的字符串参数:ls "/music/Nena - Nur getraeumt (1982) HD 0815007.mp3"

标签: python bash avconv


【解决方案1】:

在我的情况下,如果在使用 python 时找不到文件 - 检查文件名中的特殊非打印字符。

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

【讨论】:

    【解决方案2】:

    因此,通常情况下,当使用 Popen 或类似的东西时,您不想依赖相对路径。既然存在,我就继续猜测这个错误不是拼写错误,而是建议你使用绝对路径而不是相对路径,这是一个很常见的问题。

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

    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
    

    【讨论】:

    • @PadraicCunningham 我假设传递的文件实际上是 /music/Nena,因为我不相信我曾经将 /music 视为根目录,但我可能完全错了。如果不了解这里的目录结构,很难调试,但我仍然认为这很可能是问题所在。 ls'ing 文件导致错误只是因为括号和空格没有转义。
    • @PadraicCunningham 就是说,我说的不那么微妙。
    • 在Python中使用subprocess时,不必担心文件名中的特殊字符; Python 会为您处理报价。
    • @augurar 这就是为什么它是一个附录而不是核心答案。它确实会处理它,但在 OP 的问题中,注意到了 bash 语法错误,这肯定是由于特殊字符造成的。
    • 我发现了问题!文件名上有一个不可见的回车,我什至没有看到 ls -b 或 ls -q !
    猜你喜欢
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    相关资源
    最近更新 更多