NodeJ와 Python은 개발자와 웹 디자이너가 선호하는 두 가지 주요 언어입니다. 그러나 NodeJ가 파이썬에 미치지 못하는 몇 가지 영역은 수치 및 과학 계산(AI, 머신 러닝, 딥 러닝 등)입니다. python은 과학 컴퓨팅을 훨씬 쉽게 사용할 수 있도록 많은 라이브러리를 제공합니다.
다행히도 백그라운드에서 Python을 실행하고 결과를 반환하여 nodejs 애플리케이션 내에서 Python 라이브러리를 활용할 수 있습니다.
이를 위해 우리는 NodeJ의 child_process 표준 라이브러리를 사용하여 백그라운드에서 pyton 프로세스를 생성하고 계산을 수행하고 결과를 노드 프로그램에 반환할 것입니다.
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>
NodeJ 상호작용
nodejs 스크립트는 먼저 python 스크립트를 호출한 다음 스크립트 출력을 클라이언트에 전달하고 클라이언트에서 출력을 렌더링하여 python 스크립트와 상호 작용합니다.
이제 spawn() 메소드를 사용하여 자식 프로세스를 생성하려고 시도할 nodejs 스크립트를 생성해 보겠습니다.
서버.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)을 통해 출력을 제공합니다. 파이썬이 출력을 버퍼링하는 것을 방지하려면 -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