我有一個帶有兩個參數的python腳本;一個目錄和一個文件名。通過spawn從python返回JSON到節點
python腳本將從提供的目錄中的特定文件創建一個JSON對象,並使用名稱作爲第二個參數保存該對象。
但是,如果第二個參數等於字符串「stream」,則JSON數據將輸出到STDOUT。
我寫了一個節點腳本,它產生一個子進程從終端調用python腳本,它按預期工作。
"use strict";
const spawn = require("child_process").spawn;
const command = "(path to python)";
const loc = "(path to .py script)";
const acct = process.argv[2];
const output = process.argv[3];
let callPy = spawn(command, ["erik.py", acct, output], {
cwd: loc,
stdio: "pipe"
});
callPy.stdout.on("data", (data) => {
if (data.toString() === "success") {
console.log(acct, "generated");
} else {
console.log(data.toString());
}
});
編輯:
我有無人盯防的解決了這個問題:花多一點的時間來實現這個之後,我還沒有得出一個滿意的解決方案,讓我同步地從節點調用子進程,指示python腳本發出JSON數據,接收數據,然後將數據發送到瀏覽器。我試着用的子進程承諾鏈:
let child = require("child_process").spawn; // or spawnSync
let spawn =() => {
let spawned = child(command, args, options,(err, stdout, stderr) => {
if (err) { console.log(err) };
});
return spawned
};
let listen = (child) => {
child.stdout.on("data", (data) => {
console.log("PID", child.pid);
console.log("data from listen func: ", data);
return child
});
};
let kill = (child) => {
child.kill("SIGTERM");
}
var p = new Promise((res, e) => {
res(spawn())
e(console.error(e))
});
p.then(result => {
return listen(result);
})
p.then(result => {
return kill(result);
});
使用spawn()
孩子的任何數據使用spawnSync()
承諾鏈試圖返回 (和失敗)之前終止上偵聽孩子的io之前產生的孩子
我還沒有嘗試websockets傳輸數據,但我懷疑這將解決這個問題,承諾返回一個空的對象到我的路由器函數調用之前親mise chain從python腳本中檢索塊。
歡迎進一步瞭解。