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

时间:2016-12-17 15:10:02

标签: python node.js electron electron-builder

我有一个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模块electron-builder为Windows构建可执行文件并运行dist/win-unpacked/my-app.exe中的可执行文件时,这不会起作用,似乎我的脚本无法通过python ./my-script-py访问。

那么,如何让这段代码适用于已构建的项目呢?

2 个答案:

答案 0 :(得分:17)

我已经解决了我的问题。我将为可能的未来读者解释同样的问题。

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

  

<强> ASAR

     

是否将应用程序的源代码打包到存档中,   使用Electron的存档格式。默认为true。节点模块,那   必须打开包装,自动检测,你不需要   显式设置asarUnpack - 如果这不起作用,请提出问题。

     

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

     

asarUnpack

     

相对于app目录的glob模式,它指定了哪个   创建asar存档时要解压缩的文件。

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])

答案 1 :(得分:7)

您可以在extraResources中添加脚本:

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

然后dir将在app root:

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