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

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

by 카레유 2021. 1. 29.

Node.js환경, Express 웹서버 환경 등에서 파이썬 스크립트 호출 시, 보통 child_process의 spawn을 사용한다.

const spawn = require('child_process');

const result = spawn('python', ['파이썬파일.py']);

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

위 코드는 node.js 환경에서 "python 파이썬파일.py" 명령어를 실행한다.,(자세한 내용은 아래 글 참고)

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

 

근데 경우에 따라 아래와 같은 에러가 발생할 수 있다.

 

ModuleNotFoundError: No module named 'requests'

 

requests 모듈이 설치되어 있지 않다는 이야긴데, 각자의 상황에 따라 에러 문구는 다를 것이다.

(내 경우엔 그냥 node.js 환경에선 잘 되는데, express 웹서버를 띄운 환경에선 이런 에러가 발생했다.)

 

원인은 child_process모듈을 통해 실행된 python 버전에 해당 패키지가 설치되어 있지 않기 때문이다.

 

좀더 자세히 말하면,

spawn을 통해 "python 파이썬파일.py" 명령어를 실행할 때,

'python'으로 실행되는 '파이썬의 version'에 해당 pacakge가 설치되어 있지 않기 때문이다.

 

참고로 필자의 컴퓨터엔 python 버전이 여러개 설치되어 있는데,

평소엔 python3.7 버전이 실행되는데, Express 웹서버 환경에선 python2.7 버전이 실행되었고,

python2.7 버전엔 requests 패키지가 설치되어 있지 않아서, 에러가 발생한 상황이었다.

 

해결방법은

'해당 패키지가 설치된 파이썬 버전'으로 실행하도록 지정하는 것이다.

 

#해결 방법1

python 버전을 지정하여 실행:  spawn('python3', ['파이썬파일.py']); 

const spawn = require('child_process');

const result = spawn('python3', ['파이썬파일.py']);

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

필자의 경우, python3 버전에 필요한 모듈이 모두 설치되어 있어서 python3으로 파이썬 파일을 실행했다.

 

만약 잘 안 된다면, 아래와 같이 파이썬 실행파일 경로를 전부 입력해주는게 좋다.(경로는 각자 컴퓨터에 따라 다르니, 찾아보시길...)

spawn('/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7', ['파이썬파일명.py')]);

 

 

#해결 방법2

: 사용할 파이썬 버전에 해당 라이브러리를 설치한다.

 

1. 파이썬이 설치된 경로로 이동한다.

: 필자의 맥은 /usr/local/bin인데... 윈도우는 찾아보시길...

여러버전의 파이썬이 설치된 것을 알 수 있다.

 

 

2) 사용할 python버전에 해당 패키지가 설치되어 있는지 확인한다.

: pythonX.X 실행 > import 라이브러리명  실행

$ python2

Python 2.7.15 (default, Dec 27 2018, 11:56:54) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.



>>> import requests

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named requests

 

필자의 python2 버전에 'requests' 패키지가 설치되어 있지 않다는걸 알 수 있다.

그리고 node.js에서 python2 버전으로 파이썬 스크립트를 실행해서 Module Not Found 에러가 발생했음을 알 수 있다.

 

 

3) 설치되어 있지 않은 모듈을 설치해주자.

파이썬 버전별 라이브러리 설치:  pipX.X install 라이브러리명 

$ pip2 install requests

Collecting requests
  Downloading https://files.pythonhosted.org/packages/29/c1/24814557f1d22c56d50280771a17307e6bf87b70727d975fd6b2ce6b014a/requests-2.25.1-py2.py3-none-any.whl (61kB)
    100% |████████████████████████████████| 61kB 827kB/s 
Collecting chardet<5,>=3.0.2 (from requests)
  Downloading https://files.pythonhosted.org/packages/19/c7/fa589626997dd07bd87d9269342ccb74b1720384a4d739a1872bd84fbe68/chardet-4.0.0-py2.py3-none-any.whl (178kB)
    100% |████████████████████████████████| 184kB 1.6MB/s 
Collecting certifi>=2017.4.17 (from requests)
  Downloading https://files.pythonhosted.org/packages/5e/a0/5f06e1e1d463903cf0c0eebeb751791119ed7a4b3737fdc9a77f1cdfb51f/certifi-2020.12.5-py2.py3-none-any.whl (147kB)
    100% |████████████████████████████████| 153kB 3.7MB/s 
Collecting urllib3<1.27,>=1.21.1 (from requests)
  Downloading https://files.pythonhosted.org/packages/23/fc/8a49991f7905261f9ca9df5aa9b58363c3c821ce3e7f671895442b7100f2/urllib3-1.26.3-py2.py3-none-any.whl (137kB)
    100% |████████████████████████████████| 143kB 3.8MB/s 
Collecting idna<3,>=2.5 (from requests)
  Downloading https://files.pythonhosted.org/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl (58kB)
    100% |████████████████████████████████| 61kB 3.4MB/s 
Installing collected packages: chardet, certifi, urllib3, idna, requests
Successfully installed certifi-2020.12.5 chardet-4.0.0 idna-2.10 requests-2.25.1 urllib3-1.26.3

pip 뒤에 버전을 명시해준 것에 주의하자.

 

여기까지 하면 보통 해결이 되어야 하는데, 아래와 같은 에러가 발생할 수 있다. 

TypeError: str() takes at most 1 argument (2 given)

 

파이썬 코드는 3.x 버전에 맞춰 작성되었는데,

과거버전(python 2.x)의 파이썬으로 실행해서 그런 것이 아닌가 싶다.

 

이런 케이스에선 어쩔 수 없이 python3.x 이상의 버전을 사용해 주면 될 것 같다.

 

도움이 되셨길.

 

 

 

댓글