没有subprocess.Popen这样的文件或目录,不是由string命令引起的

时间:2013-02-11 10:22:27

标签: python subprocess

我正在运行一个运行wav文件的web服务,但我不想允许任何上传,所以我先用以下代码检查上传文件的持续时间:

os.chdir("/home/me/bin")
proc = subprocess.Popen(['duration',wav],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
out, errors = proc.communicate()
time = int(float(out.strip()))
if time > MAX_TIME:
    sys.exit(1)

这几个月一直运行良好,但最近(迁移后,我应该添加)我收到以下错误:

Traceback (most recent call last):
  File "/home/me/webservice.py", line 100, in <module>
    proc = subprocess.Popen(['duration',wav],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
  File "/usr/lib64/python2.6/subprocess.py", line 639, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.6/subprocess.py", line 1228, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

这个错误似乎主要是由于为命令而不是列表使用字符串引起的,但在这里并非如此。当我尝试在单独的脚本中重现此错误时,我不能。

任何人都知道这可能是什么原因?

3 个答案:

答案 0 :(得分:3)

没有路径的命令始终只在<{1}}上查找 。你不能cd到一个目录,让PATH(或你的shell)找到一个位于该目录中的命令,而不指定至少一个相对路径。这是标准的命令查找行为。

如果要在当前工作目录中运行命令,必须指定subprocess的路径,以使其明确./搜索语义不是使用

PATH环境变量中的相对路径也不受支持;向PATH添加PATH被视为安全风险,某些系统明确过滤掉PATH中的.。您必须已从允许此系统的系统迁移到禁止.中的.的系统。

答案 1 :(得分:0)

该错误可能与您向Popen提供的可执行文件有关,但可能与随后调用的另一个可执行文件有关,但在新环境的PATH中找不到。

这个确切的情况发生在我身上,问题是我没有为我正在调用的脚本安装解释器。令人沮丧的调试,因为错误消息没有告诉你哪个文件找不到。

答案 2 :(得分:-2)

请考虑在您的文件顶部执行以下操作,然后除非您出于其他原因,否则不应该chdir

import os
cmd = os.path.expanduser('~/bin/duration')
if not os.path.isfile(cmd):
    raise IOError("command '%s' not found" % cmd)


proc = subprocess.Popen([cmd,wav ...