использование скрипта wsgi для вызова exe

Я использую apache, Django и wsgi. Я также использую другую программу под названием SAS для статистического анализа. Просто чтобы дать вам некоторый контекст. Моя конечная цель заключается в том, что когда клиент нажимает кнопку «Отправить» в форме, написанной на django, вызывается соответствующий сценарий sas (через сценарий python wsgi), который выполняет вычисления на сервере, а затем перенаправляет клиента на выходная страница.

У меня есть базовый скрипт под названием test5.py. Это выглядит так:

import os
import subprocess

def application(environ, start_response):

  status = '200 OK'
  output = 'Running External Program!'

  f = open("C:\Documents and Settings\eric\Desktop\out.txt", 'a')
  f.write('hi')
  f.close()

  #os.system(r'start "C:\Program Files\SAS92\SASFoundation\9.2\sas.exe"')
  #subprocess.call([r'C:\Program Files\SAS92\SASFoundation\9.2\sas.exe'])
  #os.startfile(r'C:\Program Files\SAS92\SASFoundation\9.2\sas.exe')
  response_headers = [('Content-type', 'text/plain'),
                      ('Content-Length', str(len(output)))]

  #start_response('301 Redirect', [('Location', 'http://myserver/reports'),])
  start_response(status, response_headers)

  return [output]

Итак, что происходит, так это то, что файл out.txt действительно создается, и в него записывается hi. Это довольно круто. Первые 3 прокомментированные строки были 3 попытками того же скрипта также вызвать sas.exe, который живет на сервере. Я просто пытаюсь заставить любой .exe работать прямо сейчас, поэтому вызов paint или wordpad будет в порядке. Однако эти строки, похоже, не выполняются в контексте wsgi. Если я просто загружу командную строку Python, я смогу нормально выполнить .exes. Также последний комментарий, кажется, работает правильно при перенаправлении. Я не уверен, нужно ли мне настраивать apache для добавления исполняемых файлов. Пожалуйста, простите меня, если я неправильно использую термины. Я все еще новичок во всем этом.

Спасибо


Привет, Пауло,

Я пытался заглянуть в ваш последний комментарий. Я немного смущен относительно того, что именно я ищу или как это искать. Вот некоторая информация, которую я собрал. Кстати, я работаю на Windows XP и использую Apache 2.2.

Мой apache установлен для всех пользователей, так как в regedit переменная ServerRoot находится в разделе HKEY_LOCAL_MACHINE (http://httpd.apache.org/docs/2.2/platform/windows.html). Также я считаю, что SAS установлен под всеми пользователями. Я проверил это, когда моя коллега вошла в систему, используя ее логин, и у меня все еще был доступ. Хотя я не уверен, что это достаточный тест.

Журнал, который я получаю, когда запускаю wsgi, выглядит следующим образом. Я не уверен, имеет ли значение, что процесс пуст.

[Пн, 20 августа, 10:33:17 2012] [информация] [клиент 10.60.8.71] mod_wsgi (pid=5980, process='', application='..com|/test5'): перезагружается WSGI-скрипт 'C:/ Сайты/cprm/pyscripts/test5.wsgi'.

Также я попробовал трюк с .bat по ссылке, которую я разместил в комментарии, который я разместил ранее, но безрезультатно. Я сделал простой пакетный файл, который просто повторяет «привет», и поместил его в тот же каталог, где живут мои сценарии wsgi. Я чувствую, что там не должно быть проблем с доступом, но я могу ошибаться. Я также только что попытался вызвать простой скрипт Python, используя подпроцесс, просто для проверки. Тоже ничего не произошло.

Также, чтобы показать вам, мой файл httpd.conf выглядит так:

AllowOverride Нет Опции Нет Заказать разрешить, запретить Разрешить от всех

WSGIScriptAlias ​​/test1 "C:/sites/cprm/pyscripts/test1.wsgi" WSGIScriptAlias ​​/test2 "C:/sites/cprm/pyscripts/test2.py" WSGIScriptAlias ​​/test3 C:/sites/cprm/pyscripts/test3.py WSGIScriptAlias /test4 "C:/sites/cprm/pyscripts/test4.py" WSGIScriptAlias ​​/test5 "C:/sites/cprm/pyscripts/test5.wsgi" WSGIScriptAlias ​​/ "C:/sites/cprm/wsgi.py"

Эта информация полезна или нет? Кроме того, я ищу конкретную переменную среды или что-то в этом роде?

Еще раз спасибо


person user1604594    schedule 16.08.2012    source источник
comment
Какой статистический анализ вы делаете? proc freq/tabulate/means и т.д... и т.д.. ?   -  person Jon Clements♦    schedule 17.08.2012
comment
Я занимаюсь управлением кредитными рисками в банке. Я хотел получить интерфейс для множества моделей, которые я написал в SAS, а также на других языках. Некоторые программы больше основаны на вычислениях, в то время как другие будут использоваться только для заполнения диаграмм/отчетов.   -  person user1604594    schedule 17.08.2012


Ответы (1)


Для веб-приложений, которые выполняют фоновые вычисления или другие задачи, ИМХО лучше всего ставить задачи в очередь на обработку, а не вызывать внешний процесс из представления Django и вешать все до тех пор, пока задача не завершится. Это приводит к лучшему:

  • взаимодействие с пользователем (запрос возвращается мгновенно — используйте ajax, чтобы сообщить о статусе задачи и представить ссылку для загрузки после завершения задачи)
  • безопасность (фоновый процесс может работать с более безопасными учетными данными)
  • масштабируемость (задачи можно распределять между серверами)
  • устойчивость (по умолчанию многие веб-серверы отправляют «ошибку 500», если ваше приложение не отвечает в течение 30 секунд или около того)

Для фонового демона, обрабатывающего все записи в очереди, существует несколько подходов в зависимости от того, насколько большой вы хотите масштабировать:

  • работа cron
  • демон, использующий supervisor (или выбранный вами сторожевой таймер)
  • модуль AMQP, такой как django-celery

[редактировать]

Процесс, который вы запускаете из сценария WSGI, будет выполняться под тем же пользователем, который запускает веб-сервер. В Linux это обычно «www-data» или «никто», в Windows/IIS это «IUSR_MachineName» (или аутентифицированный пользователь, если используется аутентификация IIS). Проверьте, можете ли вы запустить программу, используя те же учетные данные, с которыми работает ваш WSGI.

person Paulo Scardine    schedule 17.08.2012
comment
Это отличный момент, который я не учел. Я изучаю джанго-сельдерей. У меня есть некоторые задачи, выполнение которых может занять 10 часов, для которых это было бы идеально. У меня также есть некоторые запросы, которые занимают всего несколько секунд. Являются ли мои вышеупомянутые попытки os.system разумными в этом случае? Также просто, чтобы помочь мне прояснить несколько вещей, поскольку я исследовал это. Я не могу иметь это, когда клиент нажимает кнопку отправки, которая запускает javaScript для вызова .exe на сервере. Это правильно? - person user1604594; 17.08.2012
comment
Кроме того, WSGI на высоком уровне выполняет то же самое, что и CGI, в том, что они создают динамический контент веб-страницы, имея возможность вызывать .py из браузера. Я чувствую, что вызов .exe не является основной целью wsgi. Думаю, мне все еще неясно, почему мои вызовы os.system не выполняются. Еще раз спасибо. - person user1604594; 17.08.2012
comment
Итак, похоже, что этот человек выполнил то, что я изначально собирался сделать: quick-and-dirty-win-xp-x" title="пытается запустить хром из wsgi python, по общему признанию, быстро и грязно win xp x"> stackoverflow.com/questions/10809944/. Все еще запутался ааааа. - person user1604594; 17.08.2012