在Electron应用程序中运行python脚本

我有一个Electron项目,它使用NodeJS的child_process模块​​执行一些python脚本。 我的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 }) 

这工作正常,如果我用npm start我的电子应用npm start当我使用npm模块electron-builder为Windows构build一个可执行文件并从dist/win-unpacked/my-app.exe运行可执行文件,这将无法正常工作似乎我的脚本不能用python ./my-script-py

那么,我怎样才能使这个代码适用于build成的项目?

我解决了我的问题。 我会解释可能的未来读者有相同的问题。

使用电子构build器,有一些选项可能不将应用程序源代码打包成电子文件。 这些选项是:

ASAR

是否使用Electron的归档格式将应用程序的源代码打包到档案中。 默认为true。 必须解压缩的节点模块将自动检测到,您不需要明确设置asarUnpack – 如果这不起作用,请提出问题。

或者你可以传递asar选项的对象。

asarUnpack

与app目录相关的glob模式,指定在创buildasar存档时要解压哪些文件。

DOCS

设置为false解决了这个问题,但不是electron-builder推荐的。

所以包括我需要解压缩到一个文件夹中的所有文件,并使用"asarUnpack" : "my-folder/*"是正确的方法。 现在所有解压缩的文件都可以在/resources/app.asar.unpacked/my-folder

另一件需要考虑的事情是使用path'./ResolvePosition.py'来查看我的电子项目的根文件夹,而不是我的NodeJS文件所在的path,我需要使用:

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

您可以将脚本包含在extraResources中 :

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

然后,目录将在应用程序根目录:

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