我正在运行一个运行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
这个错误似乎主要是由于为命令而不是列表使用字符串引起的,但在这里并非如此。当我尝试在单独的脚本中重现此错误时,我不能。
任何人都知道这可能是什么原因?
答案 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 ...