Запустить скрипт python в приложении Electron

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

вот как я называю скрипт 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
})

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

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

2 ответов


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

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

Асар

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

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

asarUnpack

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

DOCS

задание asar to 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])

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

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

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

let python = spawn('python', [path.join(app.getAppPath(), '..', 'python_scripts/my_script.py'])