子プロセスspawn()メソッドを使用してNode.jsからPythonスクリプトを実行しますか?
NodeJとPythonは、開発者とWebデザイナーの間で2つの主要な優先言語です。しかし、NodeJがPythonに達していない分野がいくつかあります。それは、数値計算と科学的計算(AI、機械学習、深層学習など)です。一方、Pythonは、科学計算をより簡単に操作するための多くのライブラリを提供します。
幸い、バックグラウンドでpythonを実行して結果を返すことで、nodejsアプリケーション内でpythonライブラリを利用できます。
このために、NodeJのchild_process標準ライブラリを使用して、バックグラウンドでPythonプロセスを生成し、計算を実行して、結果をノードプログラムに返します。
Pythonスクリプト
途中でメッセージを標準出力に出力する簡単なPythonスクリプトを作成します。
#Import library
import sys, getopt, time
def main(argv):
argument = ''
usage = 'usage: myscript.py -f <sometext>'
# parse incoming arguments
try:
opts, args = getopt.getopt(argv,"hf:",["foo="])
except getopt.GetoptError:
print(usage)
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print(usage)
sys.exit()
elif opt in ("-f", "--foo"):
argument = arg
# print output
print("Start : %s" % time.ctime())
time.sleep( 2 )
print('Foo is')
time.sleep( 2 )
print(argument)
print("End : %s" % time.ctime())
if __name__ == "__main__":
main(sys.argv[1:]) 出力
>python myscript.py -f "Hello, Python" Start : Wed Feb 20 07:52:45 2019 Foo is Hello, Python End : Wed Feb 20 07:52:49 2019
引数を指定して実行しようとすると、上記と同じ出力が生成されます:
>python myscript.py --foo "Hello, Python" >python myscript.py –h
出力
usage: myscript.py -f <Hello, Python>
NodeJsの相互作用
nodejsスクリプトは、最初にpythonスクリプトを呼び出し、次にスクリプト出力をクライアントに渡し、クライアントで出力をレンダリングすることにより、pythonスクリプトと対話します。
それでは、nodejsスクリプトを作成しましょう。ここでは、spawn()メソッドを使用して子プロセスを作成しようとします。
server.js
const path = require('path')
const {spawn} = require('child_process')
/**
* Run python myscript, pass in `-u` to not buffer console output
* @return {ChildProcess}
*/
function runScript(){
return spawn('python', [
"-u",
path.join(__dirname, 'myscript.py'),
"--foo", "some value for foo",
]);
}
const subprocess = runScript()
// print output of script
subprocess.stdout.on('data', (data) => {
console.log(`data:${data}`);
});
subprocess.stderr.on('data', (data) => {
console.log(`error:${data}`);
});
subprocess.stderr.on('close', () => {
console.log("Closed");
}); 上記のスクリプトは、.on(‘data’、callback)を介して出力を提供します。 Pythonが出力をバッファリングしないようにするには、-fフラグを使用します。そうしないと、データイベントは、実行が終了するまでプログラムからprint()ステートメントを取得しません。
>node server.js data:Start : Wed Feb 20 10:56:11 2019 data:Foo is data:some value for foo data:End : Wed Feb 20 10:56:15 2019 Closed
-
PythonでPOSTメソッドを使用して情報を渡す
CGIプログラムに情報を渡す一般的により信頼性の高い方法はPOST方法です。これは、GETメソッドとまったく同じ方法で情報をパッケージ化しますが、?の後にテキスト文字列として送信する代わりにURLでは、別のメッセージとして送信します。このメッセージは、標準入力の形式でCGIスクリプトに送られます。 例 以下は、GETメソッドとPOSTメソッドを処理する同じhello_get.pyスクリプトです。 #!/usr/bin/python Import modules for CGI handling import cgi, cgitb # Create instance of FieldStora
-
PythonでGETメソッドを使用して情報を渡す
GETメソッドは、ページリクエストに追加されたエンコードされたユーザー情報を送信します。ページとエンコードされた情報は?で区切られます次のような文字- https://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2 GETメソッドは、ブラウザからWebサーバーに情報を渡すためのデフォルトのメソッドであり、ブラウザのLocation:boxに表示される長い文字列を生成します。サーバーに渡すパスワードやその他の機密情報がある場合は、GETメソッドを使用しないでください。 GETメソッドにはサイズ制限があります。リクエスト文字列で