24

我有一个 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 模块为 Windows 构建可执行文件electron-builder并从中运行可执行文件时运行电子应用程序dist/win-unpacked/my-app.exe,这将正常工作,这将不起作用,似乎我的脚本无法使用python ./my-script-py.

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

4

2 回答 2

21

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

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

阿萨尔

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

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

asar解包

与应用程序目录相关的 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])
于 2016-12-18T15:01:07.597 回答
14

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

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

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

let python = spawn('python', [path.join(app.getAppPath(), '..', 'python_scripts/my_script.py'])
于 2017-01-11T02:10:24.453 回答