[英]unable to run python file from Node.js
我有一個 Python 文件,里面有一個 ML model,當我與 cmd 分開運行時,它工作得很好。
每當我在特定路線上發帖時,我目前都在嘗試從節點運行它。
但是,到目前為止,我未能運行 python 腳本。
到目前為止,我在節點中使用了兩個模塊,我使用了 child_process,我還使用了@fridgerator/pynode。
1- @fridgerator/pynode 出現的問題是它不斷給出錯誤, ModuleNotFoundError: No module named 'team_match_prediction3' Failed to load module: team_match_prediction3
team_match_prediction3 是我與 node.js 文件一起放置的 python 文件名:
以下是帶有 @fridgerator/pynode 模塊的 Node.js 路由的代碼:
router.post(("/team"),(req, res) =>
{
let regressionModel = {};
pynode.startInterpreter();
pynode.appendSysPath('./');
pynode.openFile('team_match_prediction3');
let team_1 = req.body.Team1;
let team_2 = req.body.Team2;
new Promise((resolve, reject) => {
try {
if (_.isEmpty(regressionModel)) {
console.log('calling python');
regressionModel = pynode.call('starting_func',team_1, team_2);
}
resolve(regressionModel);
} catch(err) {
console.log(err);
reject('failed to load Teams variables');
}
})
.then(response => res.send(response))
.catch(err => res.err(err));
});
我從這個網站找到了這個 pynode 代碼片段: https://thecodinginterface.com/blog/bridging-nodejs-and-python-with-pynode/
2- 然后我使用子進程模塊,該模塊出現的問題是, stdout.on("data")方法沒有運行,它甚至不會等待 python 腳本完成並運行python.on('關閉') function。
這是 child_process 部分的 node.js 代碼:
//The import
const {spawn} = require('child_process');
router.post(("/team"),(req, res) =>
{
let team_1 = req.body.Team1;
let team_2 = req.body.Team2;
const python = spawn('python', ['./team_match_prediction3.py' , team_1,team_2]);
let dataToSend = [];
python.stdout.on('data', (data) => {
console.log('Pipe data from python script ...');
dataToSend.push(data);
});
// in close event we are sure that stream from child process is closed
python.on('close', (code) => {
console.log(`child process close all stdio with code ${code}`);
// send data to browser
res.send(`THis is result : ${dataToSend}`);
});
當我使用子進程模塊時,它只給出一個以 pid 2 結束的進程的 console.log,這幾乎立即發生,並且不發送任何數據作為響應。
關於 python 文件,對於 pynode 模塊,我剛剛創建了一個 function 由 pynode 調用,它只調用 clean_and_predict function 剛剛返回所需的數據,
但是當我使用子進程時,我只是在 python 文件中在全局級別執行此操作:
team_1 = sys.argv[1]
team_2 = sys.argv[2]
semi = [(team_1,team_2)]
clean_and_predict(semi, ranking, final, rf)
和 clean_and_predict function 完成它的工作,最后,只打印出所需的數據,我這樣做:
print(final_answer["Winner"])
sys.stdout.flush()
final_answer 是一個字典,其中 Winner 具有獲勝板球隊的名稱。
任何有關如何解決此問題或是否應使用新模塊的想法都將不勝感激,謝謝。
我能夠解決這個問題,首先我通過提供存儲 server.js 文件的文件夾的路徑而不是調用 python 文件的路由器文件來部分解決文件未找到錯誤。
另一個問題是等待 python 文件執行並從中獲取結果,我使用 npm 模塊 execa 來執行此操作,
這是調用和等待 python 文件的節點部分:
const execa = require('execa');
然后在郵寄路線中:
let team_1 = req.body.Team1;
let team_2 = req.body.Team2;
const subprocess = execa('python
path/to/pythonfile/from/serve.js/folder', [team_1,team_2]);
subprocess.stdout.pipe(process.stdout);
(async () => {
const {stdout} = await subprocess;
// Returning Result:
res.send(stdout);
console.log('child output:', stdout);
})();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.