Popen不再使用apache/wsgi和python 2.7.2了吗?

Eri*_*ric 9 python apache mod-wsgi

用于通过使用python subprocess.Popen制作一些shell命令的django应用程序不再起作用,因为我升级到ubuntu到11.10

为了简化问题,我将错误的代码放入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()
Run Code Online (Sandbox Code Playgroud)

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

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

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

[Tue Nov 29 11:34:38 2011] [error] ('', '') -6
Run Code Online (Sandbox Code Playgroud)

这个错误是什么'-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
Run Code Online (Sandbox Code Playgroud)

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

Gra*_*ton 16

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

http://bugs.python.org/issue13156

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

WSGIApplicationGroup %{GLOBAL}
Run Code Online (Sandbox Code Playgroud)

  • 此答案需要 +10 按钮! (2认同)