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, ...]);
あとは、pythonスクリプトでimport sys
を確認し、arg1
、sys.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つが呼び出す関数を決定し、他の引数がその関数に渡されるようにすることができます。
これが明確であったことを願っています。何か説明が必要かどうか教えてください。
例 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!'))
extrabacon
によるpython-Shell
モジュールは、基本的だが効率的なプロセス間通信とより良いエラー処理を使ってNode.jsからPythonスクリプトを実行する簡単な方法です。
インストール:npm install python-Shell
。
var PythonShell = require('python-Shell');
PythonShell.run('my_script.py', function (err) {
if (err) throw err;
console.log('finished');
});
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
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
私はノード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)
})
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モジュールが私がする必要があるいくつかの要求をロードしないので、人為的な例ではありません