web-dev-qa-db-ja.com

Node.jsからPython関数を呼び出す方法

Express Node.jsアプリケーションがありますが、Pythonで使用する機械学習アルゴリズムもあります。 Node.jsアプリケーションからPythonの関数を呼び出して機械学習ライブラリの機能を利用する方法はありますか?

126
Genjuro

私が知っている最も簡単な方法は、ノードにパッケージ化されている「child_process」パッケージを使用することです。

その後、次のようなことができます:

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

あとは、pythonスクリプトでimport sysを確認し、arg1sys.argv[1]を使用してarg2にアクセスできることを確認するだけです。 sys.argv[2]など。

ノードにデータを送り返すには、pythonスクリプトで以下を実行します。

print(dataToSendBack)
sys.stdout.flush()

そして、ノードは以下を使用してデータをリッスンできます。

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

これにより、spawnを使用して複数の引数をスクリプトに渡すことができるため、pythonスクリプトを再構築して、引数の1つが呼び出す関数を決定し、他の引数がその関数に渡されるようにすることができます。

これが明確であったことを願っています。何か説明が必要かどうか教えてください。

190
NeverForgetY2K

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!'))

Pythonスクリプトに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!'))
62
Amit Upadhyay

extrabaconによるpython-Shellモジュールは、基本的だが効率的なプロセス間通信とより良いエラー処理を使ってNode.jsからPythonスクリプトを実行する簡単な方法です。

インストール:npm install python-Shell

簡単なPythonスクリプトを実行する:

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

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

引数とオプションを使ってPythonスクリプトを実行する:

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);
});

完全なドキュメントとソースコードについては、チェックアウトしてください https://github.com/extrabacon/python-Shell

20
Soumik Rakshit

Node.jsの子プロセスモジュールは、JavaScript以外の言語(Pythonなど)でスクリプトやコマンドを実行する機能も提供します。機械学習アルゴリズム、ディープラーニングアルゴリズム、およびPythonライブラリを介して提供される多くの機能をNode.jsアプリケーションに実装できます。子プロセスモジュールを使用すると、Node.jsアプリケーションでPythonスクリプトを実行し、Pythonスクリプトにデータを入出力することができます。

child_process.spawn():このメソッドは子プロセスを非同期に生成するのに役立ちます。

2つのコマンドライン引数を姓と名として受け取り、それらを表示する単純なPythonスクリプトを作成しましょう。後で、そのスクリプトをNode.jsアプリケーションから実行し、ブラウザウィンドウに出力を表示します。

Pythonスクリプト:

import sys
# Takes first name and last name via command
# line arguments and then display them
print("Output from Python")
print("First name: " + sys.argv[1])
print("Last name: " + sys.argv[2])

# Save the script as hello.py

Node.jsサーバーコード:

// Import Express.js JavaScript module into the application
// and creates its variable.
var express = require('express');
var app = express();

// Creates a server which runs on port 3000 and
// can be accessed through localhost:3000
app.listen(3000, function() {
    console.log('server running on port 3000');
} )

// Function callName() is executed whenever
// the URL is of the form localhost:3000/name
app.get('/name', callName);

function callName(req, res) {

    // Use child_process.spawn method from
    // child_process module and assign it
    // to variable spawn
    var spawn = require("child_process").spawn;

    // Parameters passed in spawn -
    // 1. type_of_script
    // 2. List containing Path of the script
    //    and arguments for the script

    // E.g.: http://localhost:3000/name?firstname=Mike&lastname=Will
    // So, first name = Mike and last name = Will
    var process = spawn('python',["./hello.py",
                            req.query.firstname,
                            req.query.lastname] );

    // Takes stdout data from script which executed
    // with arguments and send this data to res object
    process.stdout.on('data', function(data) {
        res.send(data.toString());
    } )
}

// Save code as start.js

Pythonスクリプトとサーバースクリプトのコードを保存したら、次のコマンドを実行してそのソースフォルダーからコードを実行します。

node start.js
14
Rubin bhandari

私はノード10と子プロセス1.0.2にいます。 Pythonからのデータはバイト配列であり、変換する必要があります。 Pythonでhttpリクエストを行うもう1つの簡単な例です。

ノード

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()

pSノードのhttpモジュールが私がする必要があるいくつかの要求をロードしないので、人為的な例ではありません

1
1mike12

あなたは自分のpythonを transpile それを取り、それがjavascriptであるかのようにそれを呼ぶことができます。私はこれをうまくやったことがあって、ブラウザで実行することさえできました brython

0
Jonathan