[Node.js] child process

오버·2022년 7월 4일
0

Node.js Study

목록 보기
12/22

Child Process?

오늘은 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

profile
개발자

0개의 댓글