IT박스

Node.js에서 Python 함수를 호출하는 방법

itboxs 2020. 6. 14. 11:14
반응형

Node.js에서 Python 함수를 호출하는 방법


Express Node.js 응용 프로그램이 있지만 Python에서 사용할 기계 학습 알고리즘도 있습니다. 기계 학습 라이브러리의 강력한 기능을 활용하기 위해 Node.js 애플리케이션에서 Python 함수를 호출 할 수있는 방법이 있습니까?


내가 아는 가장 쉬운 방법은 노드와 함께 제공되는 "child_process"패키지를 사용하는 것입니다.

그런 다음 다음과 같은 작업을 수행 할 수 있습니다.

const spawn = require("child_process").spawn;
const pythonProcess = spawn('python',["path/to/script.py", arg1, arg2, ...]);

그런 다음 import sys파이썬 스크립트를 arg1사용하고 sys.argv[1],, 등을 arg2사용하여 액세스 할 수 있습니다 sys.argv[2].

노드로 데이터를 다시 보내려면 파이썬 스크립트에서 다음을 수행하십시오.

print(dataToSendBack)
sys.stdout.flush()

그런 다음 노드는 다음을 사용하여 데이터를 청취 할 수 있습니다.

pythonProcess.stdout.on('data', (data) => {
    // Do something with the data returned from python script
});

이렇게하면 스폰을 사용하여 여러 인수를 스크립트에 전달할 수 있으므로 인수 중 하나가 호출 할 함수를 결정하고 다른 인수는 해당 함수 등에 전달되도록 Python 스크립트를 재구성 할 수 있습니다.

이것이 분명하기를 바랍니다. 설명이 필요한지 알려주세요.


Python을 사용하고 Node.js 애플리케이션에 머신 러닝 모델을 통합하려는 사람들을위한 :

child_process핵심 모듈을 사용합니다 .

const express = require('express')
const app = express()

app.get('/', (req, res) => {

    const { spawn } = require('child_process');
    const pyProg = spawn('python', ['./../pypy.py']);

    pyProg.stdout.on('data', function(data) {

        console.log(data.toString());
        res.write(data);
        res.end('end');
    });
})

app.listen(4000, () => console.log('Application listening on port 4000!'))

sys파이썬 스크립트 에는 모듈이 필요하지 않습니다 .

다음은 다음을 사용하여 작업을 수행하는 모듈 방식입니다 Promise.

const express = require('express')
const app = express()

let runPy = new Promise(function(success, nosuccess) {

    const { spawn } = require('child_process');
    const pyprog = spawn('python', ['./../pypy.py']);

    pyprog.stdout.on('data', function(data) {

        success(data);
    });

    pyprog.stderr.on('data', (data) => {

        nosuccess(data);
    });
});

app.get('/', (req, res) => {

    res.write('welcome\n');

    runPy.then(function(fromRunpy) {
        console.log(fromRunpy.toString());
        res.end(fromRunpy);
    });
})

app.listen(4000, () => console.log('Application listening on port 4000!'))

python-shell모듈 extrabacon은 Node.js에서 기본이지만 효율적인 프로세스 간 통신과 더 나은 오류 처리를 통해 Python 스크립트를 실행하는 간단한 방법입니다.

Installation: npm install python-shell.

Running a simple Python script:

var PythonShell = require('python-shell');

PythonShell.run('my_script.py', function (err) {
  if (err) throw err;
  console.log('finished');
});

Running a Python script with arguments and options:

var PythonShell = require('python-shell');

var options = {
  mode: 'text',
  pythonPath: 'path/to/python',
  pythonOptions: ['-u'],
  scriptPath: 'path/to/my/scripts',
  args: ['value1', 'value2', 'value3']
};

PythonShell.run('my_script.py', options, function (err, results) {
  if (err) 
    throw err;
  // Results is an array consisting of messages collected during execution
  console.log('results: %j', results);
});

For the full documentation and source code, check out https://github.com/extrabacon/python-shell


I'm on node 10 and child process 1.0.2. The data from python is a byte array and has to be converted. Just another quick example of making a http request in python.

node

const process = spawn("python", ["services/request.py", "https://www.google.com"])

return new Promise((resolve, reject) =>{
    process.stdout.on("data", data =>{
        resolve(data.toString()); // <------------ by default converts to utf-8
    })
    process.stderr.on("data", reject)
})

request.py

import urllib.request
import sys

def karl_morrison_is_a_pedant():   
    response = urllib.request.urlopen(sys.argv[1])
    html = response.read()
    print(html)
    sys.stdout.flush()

karl_morrison_is_a_pedant()

p.s. not a contrived example since node's http module doesn't load a few requests I need to make


You could take your python, transpile it, and then call it as if it were javascript. I have done this succesfully for screeps and even got it to run in the browser a la brython.

참고URL : https://stackoverflow.com/questions/23450534/how-to-call-a-python-function-from-node-js

반응형