【问题标题】:using wsgi script to call exe使用wsgi脚本调用exe
【发布时间】:2012-08-13 09:20:13
【问题描述】:

我正在运行 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 时得到的日志如下。我不确定进程是否为空是否重要。

[2012 年 8 月 20 日星期一 10:33:17] [info] [client 10.60.8.71] mod_wsgi (pid=5980, process='', application='..com|/test5'): 重新加载 WSGI 脚本' C:/Sites/cprm/pyscripts/test5.wsgi'。

我还尝试了我在之前发布的评论中发布的链接中的 .bat 技巧,但无济于事。我制作了一个简单的批处理文件,它只是回显“hi”并将它放在我的 wsgi 脚本所在的同一目录中。我觉得那里应该没有访问问题,但我可能弄错了。我也只是尝试使用 subprocess 调用一个简单的 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"

这些信息是否有用?另外,我是在寻找特定的环境变量还是什么?

再次感谢

【问题讨论】:

  • 你在做什么统计分析? proc freq/tabulate/means 等等……等等……?
  • 我在一家银行从事信用风险管理工作。我想要一种方法来前端我用 SAS 以及其他语言编写的一堆模型。有些程序更多地基于计算,而其他程序仅用于填充图表/报告。

标签: python django exe wsgi


【解决方案1】:

对于执行后台计算或其他任务的 Web 应用程序,恕我直言,最好将任务排队等待处理,而不是从 Django 视图调用外部进程并挂起所有内容,直到任务完成。这会带来更好的结果:

  • 用户体验(请求立即返回 - 使用 ajax 指示任务状态并在任务完成后显示下载链接)
  • 安全性(后台进程可以在更安全的凭据下运行)
  • 可扩展性(任务可以分布在服务器之间)
  • 弹性(默认情况下,如果您的应用程序在 30 秒左右未能响应,许多网络服务器将发送“错误 500”)

对于处理队列中所有条目的后台守护程序,有几种方法取决于您想要扩展的规模:

  • 一个 cron 作业
  • 使用supervisor(或您选择的看门狗)的守护进程
  • 一个像django-celery这样的AMQP模块

[编辑]

您从 WSGI 脚本启动的进程将在运行网络服务器的同一用户下运行。在 linux 中,它通常是“www-data”或“nobody”,在 Windows/IIS 中,它是“IUSR_MachineName”(如果使用 IIS 身份验证,则为经过身份验证的用户)。检查您是否可以使用运行 WSGI 的相同凭据启动程序。

【讨论】:

  • 这是一个很好的观点,我没有考虑过。我正在研究 django-celery。我有一些任务可能需要 10 个小时才能运行,这将是完美的。然而,我也有一些只需要几秒钟的查询。在这种情况下,我的上述 os.system 尝试是否合理?也只是为了帮助我澄清一些事情,因为我一直在研究这个。我不能在客户端点击提交时触发 javaScript 在服务器上调用 .exe。对吗?
  • 在高级别的 WSGI 也完成了与 CGI 相同的事情,即它们通过能够从浏览器调用 .py 来制作动态网页内容。我觉得调用 .exe 并不是 wsgi 的主要目的。我想我仍然不清楚为什么我的 os.system 调用不执行。再次感谢。
  • 看来这个人已经完成了我最初打算做的事情:stackoverflow.com/questions/10809944/…。还是一头雾水啊啊啊。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 2014-12-07
  • 2020-11-12
  • 2011-06-06
相关资源
最近更新 更多