使用wsgi脚本来调用exe

时间:2012-08-16 23:59:26

标签: python django exe wsgi

我正在运行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来添加可执行文件。如果我错误地使用了条款,请原谅我。我对这一切还很陌生。

由于


Hi Paulo,

我试图调查你的最后评论。我对我正在寻找什么或如何寻找它有点困惑。以下是我收集的一些信息。顺便说一句,我在Windows XP上运行并使用Apache 2.2。

我的apache是​​为所有用户安装的,因为在regedit中变量ServerRoot位于HKEY_LOCAL_MACHINE(http://httpd.apache.org/docs/2.2/platform/windows.html)下。另外我相信SAS安装在所有用户之下。我通过让我的同事使用她的登录登录进行测试,我仍然可以访问。我不确定这是否是一个充分的测试。

运行wsgi时得到的日志如下。我不确定这个过程是否空洞。

[Mon Aug 20 10:33:17 2012] [info] [client 10.60.8.71] mod_wsgi(pid = 5980,process ='',application ='.. com | / test5'):重新加载WSGI脚本' C:/Sites/cprm/pyscripts/test5.wsgi”

此外,我在我之前发布的评论中发布的链接中尝试了.bat技巧无济于事。我创建了一个简单的批处理文件,它只是回应'hi'并将其放在我的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”

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

再次感谢

1 个答案:

答案 0 :(得分:1)

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

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

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

[编辑]

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