a. プログラムの入出力を処理するには: Pexpect。使い方はかなり簡単で、配布されているいくつかの例を読むだけで、基本を理解するのに十分なはずです。
b. Javascript インターフェース:
さて、私は gevent を使用しています。これは組み込みの WSGI サーバーです。( WSGIサーバー(別の)とは何かを調べてください)。このプログラムは状態を保持するため、セッション 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", [("Content-Type", "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", [("Content-Type", "text/html; charset=utf-8")])
return "Success"
elif i==1:
start_response("500 Internal Server Error", [("Content-Type", "text/html; charset=utf-8")])
return "Failure"
elif i==2:
start_response("500 Internal Server Error", [("Content-Type", "text/html; charset=utf-8")])
return "Error"
私が提案する別のオプションは、Nginx + uWSGI です。もしよろしければ、その例もいくつか挙げることができます。これにより、Web サーバーをセットアップに組み込む利点が得られます。