【问题标题】:How can i use a commandlinetool (ie. sox) via subprocess.Popen with mod_wsgi?如何通过 subprocess.Popen 和 mod_wsgi 使用命令行工具(即 sox)?
【发布时间】:2011-03-06 21:09:42
【问题描述】:

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

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 的命令行工具?

【问题讨论】:

  • 发布您遇到的实际错误的详细信息?你在使用 mod_wsgi 3.X 吗?
  • 我遇到了类似的问题,最后只是将文件写入服务器上的 ram 驱动器 (/dev/shm),然后在转换后将其删除。如果您找到解决此问题的更好方法,请告诉我。
  • 不,我刚刚更新到 wsgi 3.x。据我所知,这解决了问题并使上面的代码正常工作。

标签: django mod-wsgi


【解决方案1】:

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

http://code.google.com/p/modwsgi/wiki/ApplicationIssues

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

http://blog.dscpl.com.au/2009/04/wsgi-and-printing-to-standard-output.html

【讨论】:

  • 好的,所以在睡了一会儿之后,我意识到这可能不是 mod_wsgi 的问题。我已经编辑了我的问题以反映这一点。
猜你喜欢
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 2014-12-22
  • 1970-01-01
相关资源
最近更新 更多