我的django应用程序曾经使用python subprocess.Popen制作一些shell命令,因为我升级到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()
如果我直接通过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不再通过apache使用python 2.7了吗?
答案 0 :(得分:16)
因为最新的Python 2.7中有一个错误导致子解释器中的fork运行失败。
http://bugs.python.org/issue13156
假设只托管一个WSGI应用程序,通过添加到Apache配置强制使用主解释器而不是子解释器:
WSGIApplicationGroup %{GLOBAL}