본문 바로가기
개발(Development)/JS(자바스크립트)

[Node.js] 자바스크립트로 파이썬 연동 실행 방법(함수 매개변수 전달 호출 : child-process)

by 카레유 2021. 1. 27.

# Node.js환경에서 javascript로 python 스크립트를 실행하는 방법

=> node의 기본 내장 모듈인 "child-process" 를 사용하면 된다.

(python-shell 등의 외부 라이브러리를 사용할 수도 있긴 하다.)

 

이번 글에서는 아래의 사항을 순서대로 정리한다.

 

1. 기본 사용법

2. 자바스크립트로 "파이썬 파일 실행" 방법

3. 자바스크립트로 "파이썬 함수 실행" 방법

4. 자바스크립트로 "파이썬 함수에 인수 전달" 호출 방법

 

# 기본 사용법

1. 실행 : child-process 모듈의 spawn을 통해 파이썬 파일을 실행한다.

const result = require('child_process').spawn('python', [ '파이썬파일.py', '매개변수1', '매개변수2', ... ]);

 

2. 결과 : stdout의 이벤트리스터를 통해 실행 결과를 받는다.

result.stdout.on('data', function(data) {

      console.log(data.toString());

});

 

<기본 사용법 코드 전문>

// 1. child-process모듈의 spawn 취득
const spawn = require('child_process').spawn;

// 2. spawn을 통해 "python 파이썬파일.py" 명령어 실행
const result = spawn('python', ['파이썬파일.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());
});

 

const result = spawn('python', ['파이썬파일명.py', 매개변수1, 매개변수2, ... ]);

//이 코드는 "python 파이썬파일.py 매개변수1, 매개변수2" 명령어로 파이썬 코드를 실행는 것과 동일하게 작동한다. 

 

 

# python 코드 실행 방법

1. python 코드 

# print.py 파일

print('저는 카레유 입니다')

- "저는 카레유입니다"를 출력하는 파이썬 코드다.

 

 

2. javascript 코드에서 파이썬 코드 실행 및 결과 출력

// connectPython_print.js 파일

const spawn = require('child_process').spawn;

const result = spawn('python', ['print.py'));

result.stdout.on('data', function(data) {
    console.log(data.toString());
});

result.stderr.on('data', function(data) {
    console.log(data.toString());
});

1) child-process의 spawn을 통해 "python print.py" 명령어를 실행하여 파이썬 코드를 구동한다.

2) stdout의 'data' 이벤트 리스터를 통해 결과를 받아서 출력한다.

3) 위 코드에서 data를 toString()없이 사용하면, 버퍼가 출력되니 주의.

  - <Buffer 49 20 61 6d 20 70 79 74 68 6f 6e 0a>

 

 

# 파이썬  함수 실행 방법

1. 함수가 정의된 파이썬 코드 작성

# function_print.py 파일

def getValue():
    print ("value")

if __name__ == '__main__':
    getValue()

1) 파라미터가 없는 getValue함수를 선언하여 "value" 값을 출력하도록 했다.

 

2) if문을 통해 실행환경이 '__main__' 인 경우, getValue함수를 호출하도록 설정했다

  - "python 파이썬파일.py"으로 파이썬 파일을 직접 실행하면 내부 변수 __name__에 "__main__" 값이 할당된다.

  - spawn('pyton', ['파이썬파일명'.py])를 실행하면, 내부적으로  "python 파이썬파일.py"을 실행한다.

  - 따라서 __name__ 값이 __main__이 되어, 위 코드는 getValue()함수를 실행하게 된다.

  - 참고) import 등을 통해 모듈로 불러와 사용할 땐, __name__ 에 __main__이 아니라, 모듈 명이 들어간다.

 

 

2. 자바스크립트에서 파이썬 함수 호출

const spawn = require('child_process').spawn;

const result_01 = spawn('python', ['function_print.py'], );

result_01.stdout.on('data', (result)=>{
    console.log(result.toString());
});

- 자바스크립트에서 파이썬 함수를 출력하는 것은 다를게 없다.

- 단, 파이썬 파일에 __name__ == '__main__' 인 경우, 함수를 호출하도록 설정되어 있어야 한다.

 

 

# 파이썬 함수 "인수 전달" 호출 방법

1. 인자를 받는 함수가 정의된 파이썬 코드

# function_args.py 파일

import sys

def getName(name, age):
    print (name + " : " + age)

if __name__ == '__main__':
    getName(sys.argv[1], sys.argv[2])

1) 매개변수를 받기위해 파이썬의 sys 모듈을 임포트했다.

2) name, age 인자를 받아, 출력하는 getName함수를 정의했다.

3) 실행환경 체크 조건문에서 함수를 호출하면서 sys.argv[1], sys.argv[2] 로 인수를 전달했다.

 

 

2. 자바스크립트에서 파이썬 함수를 호출하면서 매개변수 전달

const result_02 = spawn('python', ['function_args.py', '카레유', '20']);

result_02.stdout.on('data', (result)=>{
    console.log(result.toString());
});

// 출력 결과 => "카레유 : 20"

1) spawn을 통해 "python function_args.py"를 실행시키면서, "카레유", 20"을 파라미터로 전달 했다.

 


참고로 child-process 모듈에서는 spawn뿐만 아니라, exec을 통해서도 외부 명령어를 실행할 수 있다.

1. spawn은 별도 프로세스를 띄워서 명령어를 실행하고,

2. exce은 셸을 띄워서 명령어를 실행한다.

 

예를 들어 아래 코드는 현재 경로의 파일 목록을 출력한다.

const exec = require('child_process').exec;

const result = exec('ls');

result.stdout.on('data', function(ls_result){
    console.log(ls_result.toString());
})

유닉스, 리눅스 환경에서는 ls를 사용하고, 윈도우 환경에선 dir 을 사용하면 된다.

 

도움이 되시길.

 

 

p.s : 기본적으로 컴퓨터에 python이 설치되어 있어야 한다.

 

< 파이썬 연동 호출 시, Module Not Found Error 발생할 경우 참고 >

[Node.js] javascript로 python 연동 호출 오류: Module Not Found Error

 

 

댓글