0

我正在运行一个在 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

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

有人知道这里可能是什么原因吗?

4

3 回答 3

3

没有路径的命令总是PATH. 您不能 cd 到一个目录并让subprocess(或您的外壳程序)找到位于该目录中的命令而不指定至少一个相对路径。这是标准的命令查找行为。

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

PATH也不支持环境变量中的相对路径;添加.到 PATH 被认为是一种安全风险,并且某些系统会明确.从 PATH 中过滤掉。您必须已从允许这样做的系统迁移到.PATH.

于 2013-02-11T10:44:52.460 回答
0

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

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

于 2013-05-12T08:32:28.660 回答
-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 ...
于 2013-02-11T12:02:37.150 回答