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

Jos*_*igo 17 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
})
Run Code Online (Sandbox Code Playgroud)

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

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

Jos*_*igo 18

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

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

ASAR

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

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

asarUnpack

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

DOCS

设置asarfalse解决问题,但不建议使用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])
Run Code Online (Sandbox Code Playgroud)


HdN*_*dN8 9

您可以在extraResources中包含脚本:

"build": {
    "extraResources": "python_scripts",
...
Run Code Online (Sandbox Code Playgroud)

然后dir将在app root:

let python = spawn('python', [path.join(app.getAppPath(), '..', 'python_scripts/my_script.py'])
Run Code Online (Sandbox Code Playgroud)