我有一个自定义的django文件字段,它使用sox,一个命令行audiotool。只要我使用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中的命令行工具?
答案 0 :(得分:0)
将调试添加到程序中以记录stderr'self.path'的值以确保它实际设置为某个值。消息'缺少文件名'表明它可能是空的。另请注意,在Apache / mod_wsgi上运行时,必须对文件使用绝对路径名,因为当前工作目录不会像Django开发服务器那样是项目目录。最后,Apache作为特殊用户运行,因此它需要对您需要访问/写入的目录具有适当的读取和/或写入权限。路径和访问问题记录在:
http://code.google.com/p/modwsgi/wiki/ApplicationIssues
BTW,对于stdout问题,你真的应该升级到mod_wsgi 3.3。读:http://blog.dscpl.com.au/2009/04/wsgi-and-printing-to-standard-output.html