簡體   English   中英

無法從 Node.js 運行 python 文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM