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

Run python script in Electron app

我有一个 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
})

如果我 运行 我的 electron 应用程序 npm start 这很好用 当我使用 npm 模块 electron-builder 和 运行 来自 dist/win-unpacked/my-app.exe 的可执行文件为 Windows 构建可执行文件时,这将不起作用,似乎我的脚本无法访问python ./my-script-py.

那么,我怎样才能让这个代码适用于构建的项目?

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

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

asar

Whether to package the application’s source code into an archive, using Electron’s archive format. Defaults to true. Node modules, that must be unpacked, will be detected automatically, you don’t need to explicitly set asarUnpack - please file issue if this doesn’t work.

Or you can pass object of asar options.

asarUnpack

A glob patterns relative to the app directory, which specifies which files to unpack when creating the asar archive.

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

您可以在 extraResources 中包含脚本:

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

然后目录将位于应用程序根目录:

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