Python 没有包含subprocess.Popen的此类文件或目录,这不是由string命令引起的

Python 没有包含subprocess.Popen的此类文件或目录,这不是由string命令引起的,python,subprocess,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

我正在运行一个在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
回溯(最近一次呼叫最后一次):
文件“/home/me/webservice.py”,第100行,在
proc=subprocess.Popen(['duration',wav],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
文件“/usr/lib64/python2.6/subprocess.py”,第639行,在__
错误读取,错误写入)
文件“/usr/lib64/python2.6/subprocess.py”,第1228行,在执行子进程中
引发子对象异常
OSError:[Errno 2]没有这样的文件或目录
这个错误似乎主要是由于命令使用了字符串而不是列表造成的,但这里的情况并非如此。当我试图在单独的脚本中重现此错误时,我不能


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

没有路径的命令总是只在
路径上查找。如果不指定至少一个相对路径,则无法将cd刻录到目录并让
子进程
(或shell)查找位于该目录中的命令。这是标准的命令查找行为

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


PATH
环境变量中的相对路径也不到处受支持;将
添加到路径被认为是一种安全风险,有些系统会从路径中明确筛选出
。您必须已从允许此操作的系统迁移到不允许在
路径中使用
的系统。请考虑在文件顶部执行以下操作,然后不需要
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 ...

该错误可能与您正在馈送到Popen的可执行文件无关,而是与随后调用的另一个可执行文件有关,并且在新环境的路径中找不到该可执行文件


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

您是否手动验证了
duration
是cmd,还是可以在指定的文件夹中执行的文件迁移后,您是否检查了PATH环境变量?对于web服务器来说可能会有所不同。哪里是
持续时间
?是的,这就是我在尝试重现错误时所做的。现在我发现添加“/”可能会解决问题,尽管我不明白为什么,因为“.”在我的路径中……在webservice执行期间,路径似乎完全改变了。当我ssh到服务器并echo$PATH时,一切都正常。当我在执行期间打印它时,它只包含“/usr/bin:/bin”。我还不知道为什么,但无论如何,这可能与此线程无关。@niefpaarschoenen:env变量可以由运行web服务所涉及的任何内容设置。服务器运行的环境、服务器本身、web服务中的python代码等都可以改变环境。@niefpaarschoenen:在任何情况下,请避免在
路径上使用
,而改用
/command
,或者最好还是使用绝对路径。从安全角度来看,这总是更好。对于那些好奇的人来说:主要原因是没有在登录shell中运行cron作业。听起来好像你假设所有内容都运行在主目录之外,为什么?OP试图运行一个脚本
/home/me/bin/duration
,我想指出的一点是,一个人不应该为了运行脚本而必须
os.chdir
。原则上,一个人应该能够从任何位置运行脚本,并且它做正确的事情。同样,我也不喜欢为了让脚本正常工作而不得不调整路径的想法。