【问题标题】:Popen does not work anymore with apache/wsgi and python 2.7.2?Popen 不再适用于 apache/wsgi 和 python 2.7.2?
【发布时间】:2012-01-08 17:11:19
【问题描述】:

自从我升级到 ubuntu 到 11.10 后,我曾经使用 python subprocess.Popen 来创建一些 shell 命令的 django 应用程序不再工作

为了简化问题,我把错误代码放到了wsgi脚本中:

import os
import sys

from subprocess import Popen,PIPE
p=Popen(['/usr/bin/id'],stdout=PIPE,stderr=PIPE)
comm=p.communicate()
print comm,p.returncode

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

如果我直接通过 python 运行这段代码,它可以工作:

$ python -V
Python 2.7.2+
$ python django_wsgi.py 
('uid=1002(www) gid=1002(www) groups=1002(www)\n', '') 0

如果我通过 apache 运行此代码(我只是将相关 URL 放入浏览器中),在 apache 日志中,我得到:

[Tue Nov 29 11:34:38 2011] [error] ('', '') -6

这个错误'-6'是什么???

问题在于我的开发服务器(Ubuntu 10.04,几乎相同的 apache/wsgi 版本,相同的 apache 配置文件,相同的环境变量,但使用 python 2.6.5)运行良好:

[Tue Nov 29 11:29:10 2011] [error] ('uid=1000(www) gid=1000(www) groups=1000(www)\\n', '') 0

你知道为什么 Popen 在 python 2.7 中不再通过 apache 工作了吗?

【问题讨论】:

    标签: python apache mod-wsgi


    【解决方案1】:

    因为最新的 Python 2.7 有一个错误,导致子解释器中的 fork 运行失败。

    http://bugs.python.org/issue13156

    假设只托管一个 WSGI 应用程序,通过添加到您的 Apache 配置来强制使用主解释器而不是子解释器:

    WSGIApplicationGroup %{GLOBAL}
    

    【讨论】:

    • 真的非常感谢你,我被卡住了,你的回答解决了我的问题:)
    • 这个答案需要 +10 按钮!
    • 答案说明了解决方法是什么。使用 WSGIApplicationGroup 指令强制为该 Web 应用程序使用主解释器。该 Python 错误也有一个补丁,您也可以使用它来修补 Python 源代码并安装新的 Python 安装并使用它。
    • 我认为知道你需要的补丁是:hg.python.org/cpython/rev/ee4fe16d9b48
    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多