루카스모
4k
2019-04-02 16:21:23 작성 2019-04-02 16:35:40 수정됨
13
4001

nodejs 에서 python 코드 실행하기 질문이요....


npm python-shell 에 있는 내용과 구글링해서 나오는 내용들을 따라하고 있는데

cmd에서  test1.js  파일을 실행하니 

PythonShell is not a constructor 라고 뜨네요..

해당 test1.js 파일을 cmd 창에서 실행하면

hello world 가 출력되야 정상입니다.


대체 뭐가 문제일까요 짧은 코드 한번만 봐주시면 감사하겠습니다.

그리고 scriptPath랑 pythonPath는 값이 없어도 되는걸로 알고있는데...

참고로 test1.js 파일하고 test.py 파일하고 같은 경로에 있습니다. 음.. 그래서 안 넣었습니다. 


1. test1.js 코드

var PythonShell = require('python-shell');
var options = {
  mode: 'text',
  encoding: 'utf8',
  pythonOptions: ['-u'],
  scriptPath: '',
  args: ['hello world'],
  pythonPath: ''
};

var test = new PythonShell('test.py', options);
test.on('message',function(message){
  console.log(message);
})


2. test.py 코드

#coding=UTF -8
import sys

if __name__ == "__main__" :

    st=sys.argv[1]
    print(st + 'from python')


0
  • 답변 13

  • KDH0110
    153
    2019-04-02 17:06:56

    js 코드부분을

    var {PythonShell} = require('python-shell');

    수정하시면 됩니다.

  • 루카스모
    4k
    2019-04-02 17:28:35

    KDH0110

    감사합니다.

    이제  PythonShell is not a constructor 라는 에러는 안뜨네요

    대신에 밑에 에러가 발생하네요..


    throw er; // Unhandled 'error' event

          ^


    Error: spawn py ENOENT



    그리고

    pythonPath: '/usr/bin/env python'

    이렇게 경로를 추가하여도 아래와 같은에러가 뜨네요.. 

    throw er; // Unhandled 'error' event

          ^


    Error: spawn /usr/bin/env python ENOENT


    참고로 어차피 .js 파일과 .py 파일이 같은 위치에 있기 때문에 경로는 추가하나 마다 의미가 없어보이는데... 후.. 해당 에러는 구글링해도 환경변수쪽 얘기를 하는데... 정확히 어떻게 하라고 나와있지도 않은거 같고.. 잘 모르겠네요 ㅠㅠㅠ

  • KDH0110
    153
    2019-04-02 17:52:47

    python 파일하고 js파일하고 같은 폴더에 있더라도 js파일을 실행하는 경로가 다른곳이라면 경로 문제가 발생할 수 있습니다.

    node test1.js 실행시 정상적으로 동작하더라도

    node test/test1.js 이면 에러가 발생합니다.

    node실행시 어디를 작업 폴더로 동작하는지 확인해 보세요

  • 엡실론
    2k
    2019-04-02 18:09:31

    python이 설치 되어 있나요?

    shell 에서 /usr/bin/env python을 실행했을 때 나오는 값을 pyhonPath에 넣어주세요.

  • 루카스모
    4k
    2019-04-02 20:49:20 작성 2019-04-02 21:13:12 수정됨

    KDH0110 

    node test1.js 실행시 어디를 작업폴더로 동작하는지는 확인하는 방법을 모르겠습니다..

    똑같은 경로에 있는 .js 파일을  cmd 창에서 실행해보니

    똑같은 경로에서 

    Conntected, 3000 port! 가 출력이 됩니다

    참고로 출력되는 내용은 실행한.js 파일안에 있는 아래 코드 때문에 실행이 됩니다.


    app.listen(3000, function(){

      console.log('Connected, 3000 port!');

    })


  • 루카스모
    4k
    2019-04-02 20:50:41

    dohyeong

    python 같은 경우는 anaconda의 jupyter notebook 으로 설치했습니다.

    그런데 shell  에서 /usr/bin/env python을 실행시키라는 말씀은

    리눅스에서

    cd /usr/bin/env python

    이렇게 입력하라는 말씀이신가요?

    이렇게 입력한결과 디렉토리가 없다고 뜨네요

    이게 아니라면 어떻게 실행하라는 말씀이시죠?

  • 엡실론
    2k
    2019-04-03 00:29:05

    아니요 그냥 쉘에서 /usr/bin/env python을 입력하라는 것입니다. 앞에도 뒤에도 아무것도 붙이지 말고요.
    /usr/bin/env 자체가 프로그램입니다.


  • 루카스모
    4k
    2019-04-03 00:45:47

    dohyeong

    말씀하신대로 리눅스(xshell)에서 /user/bin/env python 입력했습니다.

    여기에서 어떤 값을  pyhonPath = ' ' 에 넣으면 되는건가요? 아무래도 넣을게 없어보입니다..


    혹시나해서 아래처럼

    pythonPath: 'Python 2.7.122'

    pythonPath: 'GCC 5.4.0 20160609'

    둘다 해봤는데 각각 아래와 같은 에러들이 발생합니다.

    throw er; // Unhandled 'error' event

          ^

    Error: spawn Python 2.7.122 ENOENT


    throw er; // Unhandled 'error' event

          ^

    Error: spawn GCC 5.4.0 20160609 ENOENT


  • 엡실론
    2k
    2019-04-03 01:06:33

    아 이런 env에 대해서 제가 잠시 헷갈렸네요.

    쉘에서 which python을 실행하고, 그 결과를 써보세요.

  • 엡실론
    2k
    2019-04-03 01:08:44

    혹시 쉘에서 which가 없다고 나오면 pythonPath에 /usr/bin/python이라고 써보세요.


  • 루카스모
    4k
    2019-04-03 01:23:19

    dohyeong

    shell 에다 which python 이라 입력하니까

    /usr/bin/python

    이라고 출력되네요


    제가 질문한 코드에서

    pythonPath : '/usr/bin/python' 으로

    수정하고 실행해도


    이전 에 났던 오류와 유사하게 아래와 같은 에러가 발생하네요 ..하.. 

     ( throw er; // Unhandled 'error' event 같은 경우는 구글링 해도 경우가 한 케이스가 아닌거 같네요)

    events.js:167

          throw er; // Unhandled 'error' event

          ^


    Error: spawn /usr/bin/python ENOENT

        at Process.ChildProcess._handle.onexit (internal/child_process.js:232:19)

        at onErrorNT (internal/child_process.js:407:16)

        at process._tickCallback (internal/process/next_tick.js:63:19)

        at Function.Module.runMain (internal/modules/cjs/loader.js:745:11)

        at startup (internal/bootstrap/node.js:283:19)

        at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)

    Emitted 'error' event at:

        at Process.ChildProcess._handle.onexit (internal/child_process.js:238:12)

        at onErrorNT (internal/child_process.js:407:16)

        [... lines matching original stack trace ...]

        at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)


  • 엡실론
    2k
    2019-04-03 02:07:36

    쉘에서 /usr/bin/python -u test.py 'hello world' 를 한번 실행해 보세요. 제대로 결과가 나오나요?

    node는 쉘에서 실행하고 있나요?


  • 루카스모
    4k
    2019-04-03 16:13:05

    dohyeong

    계속 되는 질문에도 친절한 답변감사합니다.


    말씀하신 그대로 입력하면

    /usr/bin/python: can't open file 'test.py': [Errno 2] No such file or directory


    이라고 출력되네요

    참고로 저는 jupyter notebook 에서 작성한 test.ipynb 파일을

    download as 해서 test.py 파일로 저장하는데

    이 test.py 파일을 test1.js 파일과 같은 위치에 저장 했습니다.

      

  • 로그인을 하시면 답변을 등록할 수 있습니다.