Я тестировал приведенный ниже код в Windows XP и OSX 10.6.6 (оболочка), и он завершается, не дожидаясь завершения дочернего процесса.
invoke.py:
from subprocess import Popen, PIPE
import platform
if platform.system() == 'Windows':
close_fds=False
else:
close_fds=True
p = Popen('python long.py', stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=close_fds, shell=True)
print "Content-Type: text/plain\n"
print "invoked (%d)" % (p.pid)
long.py
import time
import os
print "start (%d)" %(os.getpid())
time.sleep(10)
print "end (%d)" %(os.getpid())
Обновление: Проверено на Windows 7 + Apache 2.2.17 + Python 2.7 + mod_wsgi 3.3.
Файл mod_wsgi.so можно загрузить с здесь .Файл должен быть переименован в mod_wsgi.so и помещен в папку модулей Apache.
invoke.wsgi: из подпроцесса импорта Popen, платформа импорта PIPE
def application(environ, start_response):
if platform.system() == 'Windows':
close_fds=False
else:
close_fds=True
p = Popen('python "C:\testing\long.py"', stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=close_fds, shell=True)
status = '200 OK'
output = "invoked (%d)" % (p.pid)
response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
*Файл 1026 * long.py был оставлен без изменений.
изменения, внесенные в httpd.conf :
append wsgi module:
LoadModule wsgi_module modules/mod_wsgi.so
добавить каталог в конфигурацию
<Directory "C:/testing">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
ссылка URL с каталогом
Alias /testapp "C:\testing"
ссылка URL с приложением wsgi
WSGIScriptAlias /testapp "C:\testing\invoke.wsgi"
Перезапустить веб-сервер.Go http://server_name/testapp Приложение должно показать идентификатор процесса и выйти.