Django 如何通过subprocess.Popen和mod_wsgi使用commandlinetool(即sox)?

Django 如何通过subprocess.Popen和mod_wsgi使用commandlinetool(即sox)?,django,mod-wsgi,Django,Mod Wsgi,我有一个定制的django文件字段,它使用了sox,一个命令行音频工具。只要我使用django开发服务器,这就可以很好地工作。但只要我切换到生产服务器,使用apache2和mod_wsgi,mod_wsgi就会捕捉到stdout的每个输出。这使得无法使用命令行工具评估文件,例如,使用它检查上传的文件是否真的是音频文件,如下所示: filetype=subprocess.Popen([sox,'--i','-t','%s'%self.path], shell=False,\

我有一个定制的django文件字段,它使用了sox,一个命令行音频工具。只要我使用django开发服务器,这就可以很好地工作。但只要我切换到生产服务器,使用apache2和mod_wsgi,mod_wsgi就会捕捉到stdout的每个输出。这使得无法使用命令行工具评估文件,例如,使用它检查上传的文件是否真的是音频文件,如下所示:

filetype=subprocess.Popen([sox,'--i','-t','%s'%self.path], shell=False,\
                          stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(filetype,error)=filetype.communicate()
if error:
    raise EnvironmentError((1,'AudioFile error while determining audioformat: %s'%error))  
有办法解决这个问题吗

编辑
我得到的错误是“缺少文件名”。我使用的是mod_wsgi 2.5,ubuntu 8.04的标准配置

edit2

当我在mod_wsgi中从django内部调用subprocess.Popen时,会发生什么?子进程stdin/stdout不应该独立于django stdin/stdout吗?在这种情况下,mod_wsgi不应该影响通过子进程调用的程序。可以使用mod_wsgi中的命令行工具吗?

将debug添加到您的程序中,以将'self.path'的值记录到stderr中,以确保它实际设置为某个值。消息“缺少文件名”表明它可能为空。还要注意,在Apache/mod_wsgi上运行时,必须使用文件的绝对路径名,因为当前的工作目录将不像Django开发服务器那样是项目目录。最后,Apache作为一个特殊用户运行,因此它需要对需要它访问/写入的目录具有适当的读写访问权限。路径和访问问题记录在:

顺便说一句,对于标准输出问题,您真的应该升级到mod_wsgi 3.3。阅读:


发布您收到的实际错误的详细信息?您使用的是mod_wsgi 3.X吗?我遇到了类似的问题,结果只是将文件写入服务器上的ram驱动器(/dev/shm),然后在转换后将其删除。如果你找到了更好的方法来解决这个问题,请告诉我。不,我刚刚更新到WSGi3.x。就我记忆所及,这解决了问题,并使上述代码正常工作。好吧,所以在睡了一会儿之后,我意识到这可能不是mod_wsgi的问题。我编辑了我的问题以反映这一点。