ざっくりいうと…
JavaScriptから「Pythonなどのプログラム」を実行できるしくみです.
JavaScriptとプログラム間で,値の受け渡しもできます.
(研究室のサーバで動かすときは,ちょっと手こずるので,
注意してください.)
2つの値をプログラムに送り,プログラム内でそれらを足し,それを返す
JavaScriptとPythonの例です.
/main.js
async function execute(l, r) {
const url = "./cgi-bin/program.py";
// プログラムの相対パス
//(プログラムは「/cgi-bin」下にいれるのが定石です)
const data = {
"left": l,
"right": r,
};
// プログラムに送りたい値を,連想配列で書きます
const request = {
"method": "POST",
"headers": {"Content-Type": "application/json", "charset":"utf-8"},
"body": JSON.stringify(data),
};
const responce = await fetch(url, request);
// ここでプログラムを実行させます
//「responce」には,プログラムからやってきたデータなどが入ります
const receivedData = await responce.json();
// プログラムからやってきたデータを,使いやすいように連想配列に変換します
return receivedData["result"];
};
async function main() {
const result = await execute(3, 5);
console.log(result)
// >> 8
};
main();
/cgi-bin/program.py
#!C:\Users\ユーザ名\AppData\Local\Programs\Python\Python38\python.exe
# coding: utf-8
# 1行目で,「#!」に続けて,Pythonのインタプリタを指定します
import sys
import io
import json
sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding = "utf-8")
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding = "utf-8")
# 日本語(2バイト文字)をふくむデータを送受信するときに
# 文字化けしないようにするためのおまじない
received_data = json.loads(sys.stdin.readline())
# 「received_data」に,JavaScriptからやってきたデータが,辞書形式で入ります
left = received_data["left"]
right = received_data["right"]
# 個々の値を使うときは,こういうふうにします
result = left + right
send_data = {
"result": result
}
# JavaScriptに送りたいデータを,辞書形式で書きます
print("Content-type: text/html; charset=utf-8\r\n")
print(json.dumps(send_data))
# JavaScriptにデータを送ります
exit()