Popen больше не работает с apache / wsgi и python 2.7.2? - PullRequest
9 голосов
/ 29 ноября 2011

Мое приложение django, которое использовало некоторые команды оболочки с помощью подпроцесса python. Больше не работает, так как я обновляюсь до 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?

1 Ответ

16 голосов
/ 29 ноября 2011

Потому что в последнем Python 2.7 есть ошибка, которая приводит к сбою форка в субинтерпретаторах.

http://bugs.python.org/issue13156

Предполагая размещение только одного WSGI-приложения, принудительно используйте основной интерпретатор, а не вспомогательный интерпретатор, добавив в конфигурацию Apache:

WSGIApplicationGroup %{GLOBAL}
...