所以已经有一个
Python程序设置在运行在我必须建立的控制台上.我将使用
Javascript构建应用程序的Web GUI界面.
我将如何
我将如何
一个.关于处理这个Python程序的输入/输出,而不用触摸原始代码.
湾通过Javascript调用发送控制台输入到Python程序.我已经研究了原始的HTTP请求/ AJAX,但我不知道我将如何将它作为Python程序的输入发送.
解决方法
一个.要处理程序的输入/输出:
Pexpect.它是相当容易使用,并阅读一些分发的示例应该教你足够的基础知识.
湾Javascript界面:
那么我使用gevent,它是内置的WSGI服务器. (查看一个WSGI server(another)是什么).我应该注意到,这个程序将保持一个状态,所以你可以通过返回一个会话ID到你的JavaScript客户端,并将你的pexpect会话存储在一个全局变量或一些其他容器中来管理你的开放会话,这样你可以完成程序的输入和输出跨多个独立的AJAX请求.然而,我离开你,因为那不是那么简单.
我所做的一切例子都是将POST请求放在一些点击你所选择的内容之后. (它不会实际工作,因为一些变量没有设置.)
相关部分:
<!-- JavaScript --> <script src="jquery.js"></script> <script type="text/javascript"> function toPython(usrdata){ $.ajax({ url: "http://yoursite.com:8080",type: "POST",data: { information : "You have a very nice website,sir.",userdata : usrdata },dataType: "json",success: function(data) { <!-- do something here --> $('#somediv').html(data); }}); $("#someButton").bind('click',toPython(something)); </script>
然后服务器:
# Python and Gevent from gevent.pywsgi import WSGIServer from gevent import monkey monkey.patch_all() # makes many blocking calls asynchronous def application(environ,start_response): if environ["REQUEST_METHOD"]!="POST": # your JS uses post,so if it isn't post,it isn't you start_response("403 Forbidden",[("Content-Type","text/html; charset=utf-8")]) return "403 Forbidden" start_response("200 OK","text/html; charset=utf-8")]) r = environ["wsgi.input"].read() # get the post data return r address = "youraddresshere",8080 server = WSGIServer(address,application) server.backlog = 256 server.serve_forever()
如果你的程序是面向对象的,那么这样做是很容易的.编辑:不需要面向对象.现在我已经包含了一些Pexpect代码
global d d = someClass() def application(environ,start_response): # get the instruction password = somethingfromwsgi # read the tutorials on WSGI to get the post stuff # figure out WHAT to do global d success = d.doSomething() # or success = funccall() prog = pexpect.spawn('python someprogram.py') prog.expect("Password: ") prog.sendline(password) i = prog.expect(["OK","not OK","error"]) if i==0: start_response("200 OK","text/html; charset=utf-8")]) return "Success" elif i==1: start_response("500 Internal Server Error","text/html; charset=utf-8")]) return "Failure" elif i==2: start_response("500 Internal Server Error","text/html; charset=utf-8")]) return "Error"
我建议的另一个选择是Nginx uWSGI.如果你愿意,我可以给你一些例子.它为您提供将Web服务器并入设置中的好处.