我有一个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
访问。
那么,如何让这段代码适用于已构建的项目呢?
答案 0 :(得分:17)
我已经解决了我的问题。我将为可能的未来读者解释同样的问题。
使用电子构建器,有一些选项可以不将应用程序源代码打包到电子文件中。 这些选项是:
<强> ASAR 强>
是否将应用程序的源代码打包到存档中, 使用Electron的存档格式。默认为true。节点模块,那 必须打开包装,自动检测,你不需要 显式设置asarUnpack - 如果这不起作用,请提出问题。
或者你可以传递asar选项的对象。
asarUnpack
相对于app目录的glob模式,它指定了哪个 创建asar存档时要解压缩的文件。
将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'])