2016-12-17 3 views
8

У меня есть проект Electron, который выполняет некоторый скрипт python с помощью модуля child_process от NodeJS. Мой скрипт python находится в корневой папке моего проекта.Запустить скрипт python в приложении Electron

Вот как я называю сценарий Python:

let py = spawn('python',['ResolvePosition.py', obsFilePath, navFilePath]) 
py.stdout.on('data', data => console.log('data : ', data.toString())) 
py.on('close',()=>{ 
    // Python ends, do stuff 
}) 

Это прекрасно работает, если я запускаю мое электронное приложение с npm start Когда я построить исполняемый файл для Windows, используя модуль НОГО electron-builder и запустить исполняемый файл из dist/win-unpacked/my-app.exe, это не сработает, кажется, что мой скрипт не доступен с python ./my-script-py.

Итак, как я могу заставить этот код работать для встроенного проекта?

ответ

8

Я решил свою проблему. Я объясню для будущих читателей такую ​​же проблему.

Используя электронный строитель, есть несколько вариантов, чтобы не упаковать исходный код приложения в электронный файл. Эти опции:

Асар

ли пакет исходного кода приложения в архив, используя формат архива Электрона. Значение по умолчанию равно true. Модули узла, что должен быть распакован, будет обнаружен автоматически, вам не нужно явно установить asarUnpack - пожалуйста, удалите файл, если это не работает.

Или вы можете сдать объект асара.

asarUnpack

А модели GLOB относительно каталога приложений, который определяет, какие файлы для распаковки при создании архива Асар.

DOCS

Установка asar для false решает эту проблему, но это не рекомендуется по electron-builder.

Так включая все файлы, которые мне нужно распаковать в папку, и с помощью "asarUnpack" : "my-folder/*" - это правильный путь. Теперь все распакованные файлы доступны в /resources/app.asar.unpacked/my-folder

Еще одна вещь, которую следует учитывать, заключается в том, что использование пути './ResolvePosition.py' будет искать корневую папку моего электронного проекта, а не путь, где находится мой файл NodeJS, мне нужно использовать:

let python = spawn('python', [path.join(__dirname, '../app.asar.unpacked/my-folder', 'ResolvePosition.py'), obsFilePath, navFilePath]) 
2

Вы можете включить скрипт в extraResources:

"build": { 
    "extraResources": "python_scripts", 
... 

а затем реж будет в корне приложения:

let python = spawn('python', [path.join(app.getAppPath(), '..', 'python_scripts/my_script.py']) 
Смежные вопросы