2017-01-04 4 views
2

Использование child_process.spawn в node.js для выполнения скрипта python через электронное приложение (node.js). Если я бегу сценарий питона на терминале (MacOS) нет никаких проблем, но, используя node.js и:Node.js child_process выполнение скрипта Python, вызывающего ошибки при импорте модулей

const spawn = require('child_process').spawn 
let ls = spawn('python', ['runserver.py','--help'], { 
    cwd: __dirname, 
    detached: true 
}) 

я получаю ошибки из python неудачных импорта модулей, таких как:

Traceback (most recent call last): 
    File "runserver.py", line 17, in <module> 
    from queue import Queue 
ImportError: No module named queue 

I «Я уже пробовал устанавливать разные среды без везения.

Edit:

Вот журналы sys.path:

  • из кода через child_process

    [ 
        '/Users/xAlien95/Desktop/test.app/Contents/Resources/app', 
        '/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg', 
        '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', 
        '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
        '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', 
        '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', 
        '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', 
        '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', 
        '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', 
        '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', 
        '/Library/Python/2.7/site-packages', 
        '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', 
        '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC' 
    ] 
    
  • от исполнения кода через терминал

    [ 
        '/Users/xAlien95/Desktop/test.app/Contents/Resources/app', 
        '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', 
        '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
        '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', 
        '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', 
        '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', 
        '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', 
        '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', 
        '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', 
        '/usr/local/lib/python2.7/site-packages', 
        '/usr/local/Cellar/protobuf/3.1.0/libexec/lib/python2.7/site-packages' 
    ] 
    

Итак, в терминале используется homebrew скачанный Python framework. Как я могу гарантировать, что то же самое произойдет в приложении node.js?

+0

Имейте скрипт python print/log sys.path. Убедитесь, что установлена ​​python. http://stackoverflow.com/questions/897792/where-is-pythons-sys-path-initialized- from from –

+0

@StephenRauch, спасибо за ваше предложение, я отредактировал вопрос. Есть ли способ легко установить эту среду в nodejs? – xAlien95

ответ

1

Один из способов найти разные библиотеки python - использовать переменную окружения PYTHONPATH. Вы можете установить это в Node.js с помощью process.env.PYTHONPATH

(DOCS) (SOURCE)

Для конкретного случая желание запустить homebrew установленный питон, питон исполняемый файл должен быть доступен по адресу:

let ls = spawn(process.env.HOMEBREW_PREFIX + '/bin/python', ['runserver.py','--help'], { 
    ... 

Если HOMEBREW_PREFIX не доступен в process.env, и путь к нужному питона известно, это может быть жестко закодированы в икру:

let ls = spawn(/*<Where my python lives>*/ + '/bin/python', ['runserver.py','--help'], { 
    ... 
+0

К сожалению, в моем 'process.env' объекте нет' PYTHONPATH' или 'HOMEBREW_PREFIX'. Но он работает, если я помещаю ''/usr/local/Cellar/python/2.7.13/bin/python''. Просто отредактируйте свой ответ с помощью «если process.env.HOMEBREW_PREFIX недоступен, просто поставьте полный путь строки до», и я помечаю его как ответ. Спасибо! – xAlien95

+0

Эй, в моем случае тоже нет PYTHONPATH или HOMEBREW_PREFIX и даже с абсолютным путем, у меня такая же проблема. Я не уверен, что у меня есть правильный путь. Иногда я получаю: spawn ENOTDIR Error! @ xAlien95, пожалуйста, помогите – AsmaG