오늘은 child Process라는 모듈에 대해서 알아볼 겁니다.
사실... 이 모듈 이번에 제가 프로젝트를 하다가 발견한 정말 요긴한 물건입니다.
무려 js에서 다른 언어를 사용할 수 있도록 해줍니다!
예를 들어서 python이라던가 말입니다.
와!
그래서 오늘은
진짜 간단하게 js에서 child process라는 친구를 이용해서 python 코드를 실행하고 그 반환값을 클라이언트로 전달하는 프로그램을 짜볼려고 합니다.
이번에 배울 child process는 내장 모듈이기 때문에 별도의 설치는 필요 없습니다. 벌써부터 너무 마음에 드네요!
const result = require('child_process').spawn('python', [ '파이썬파일.py', '매개변수1', '매개변수2', ... ]);
이게 child_process를 사용하는 방법입니다.
칸에 나와있는 대로 변수를 집어넣어주시면 됩니다. 함수 호출을 하지 않으시면 매개변수 부분은 비워주시면 됩니다.
// 1. child-process모듈의 spawn 취득 const spawn = require('child_process').spawn; // 2. spawn을 통해 "python 파이썬파일.py" 명령어 실행 const result = spawn('python', ['test.py']); // 3. stdout의 'data'이벤트리스너로 실행결과를 받는다. result.stdout.on('data', function (data) { console.log(data.toString()); }); // 4. 에러 발생 시, stderr의 'data'이벤트리스너로 실행결과를 받는다. result.stderr.on('data', function (data) { console.log(data.toString()); });
제가 대충 짜본 코드입니다. 어떻습니까? 정말 간단하지 않습니까?
stdout이 출력 부분이고
stderr가 에러를 캐치하는 부분입니다.
그리고 데이터 뒤에 .toString()이 안 들어가면 버퍼 값으로 나오니까 꼭 String을 붙여주시기 바랍니다.
띠용?
그런데 막상 출력을 할려고 보니까
콘솔창에서 한글이 깨지네요??
utf 설정이 안되어 있나 싶어서 구글링을 해봤는데
'iconv'라는 모듈로 한글 깨짐 현상을 해결하는 것 같았습니다.
npm install iconv
로 인스톨을 진행 해주시고
const spawn = require('child_process').spawn; const iconv = require('iconv-lite'); const result = spawn('python', ['test.py']); let rs result.stdout.on('data', function (data) { rs = iconv.decode(data, 'euc-kr'); console.log(rs); }); result.stderr.on('data', function (data) { rs = iconv.decode(data, 'euc-kr'); console.log(rs); });
코드를 이렇게 바꿔 주시기만 하면 한글 깨짐 현상 없이 잘 인코딩 됩니다.
저는 처음에 utf-8로 했는데 안되더라고요 ㅋㅋ 'euc-kr'이라는 인코딩 기법을 써야 한글이 제대로 인코딩 되나 봅니다.
아무튼 이렇게 python 코드가 잘 실행이 되었냐? 살펴보자면...
오 콘솔 창에서 깨지던 한글이 아무 문제 없이 제대로 출력 된 것을 확인할 수 있습니다. 정말 쉽고 간편하죠??
그럼 이제 함수를 호출 해보겠습니다.
import sys def getName(name, age): print(name + " : " + age) if __name__ == '__main__': getName(sys.argv[1], sys.argv[2])
대충 이름과 나이를 받아서 출력 해주는 프로그램을 짜봤습니다. 여기서 sys라는 모듈이 들어가는데 제가 파이썬은 잘 몰라서...
아무튼 아마 sys가 이제 system 적으로 js에 접근해서 js에서 보내준 인자들을 들고 오는 것 같습니다.
그리고 넘겨주는 매개변수는 다 문자형 데이터로 가나 봅니다. 더하기 함수를 실행 시키는데 숫자 더하기가 아니라 문자 더하기를 하더라고요.
뭐, 결론은 파이썬에서 int 형 변환을 시켜주면 됩니다.
위의 파이썬 코드처럼 받은 데이터를 int형 변환을 시켜주시면 문제 없이 더하기가 출력이 되는 모습입니다!!
방금 출력한 20을 ejs로 보내서 클라이언트에 잘 띄워준 모습!
참고로 최종 코드는 이렇습니다.
const express = require('express'); const app = express(); app.set('view engine', 'ejs'); app.set('views', './views'); const spawn = require('child_process').spawn; const iconv = require('iconv-lite'); let num1 = 10 let num2 = 10 const result = spawn('python', ['test.py', num1, num2]); let rs const port = 5000 result.stdout.on('data', function (data) { rs = iconv.decode(data, 'euc-kr'); console.log(rs); }); result.stderr.on('data', function (data) { rs = iconv.decode(data, 'euc-kr'); console.log(rs); }); app.get('/', (req, res) => { res.render('index', {number: rs}); }); app.listen(port, () => { console.log(`http://localhost:${port}`); });
자 오늘은 이런 유용한 child process라는 모듈을 알아보았습니다.
python하면 ai랑 긴밀한 관계죠? 그러니까 파이썬으로 짜여진 ai 모듈을 들고올때 정말 유용할 것 같습니다.
그럼 오늘 포스팅은 여기서~~
bye bye