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

Posted

技术标签:

【中文标题】在 Electron 应用程序中运行 python 脚本【英文标题】:Run python script in Electron app 【发布时间】:2017-05-03 04:05:11 【问题描述】:

我有一个 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 访问。

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

【问题讨论】:

【参考方案1】:

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

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

asar

是否将应用程序的源代码打包成存档, 使用 Electron 的归档格式。默认为真。节点模块,即 必须解压,会自动检测,不需要 明确设置 asarUnpack - 如果这不起作用,请提交问题。

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

asarUnpack

相对于应用程序目录的全局模式,它指定哪个 创建 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])

【讨论】:

您假设运行应用程序的客户端安装了 python?或者你是用电子应用程序打包 python 吗? 是的,这里我假设客户端安装了 Python。 (因为客户只是我)我不确定如何轻松解决这个问题。 @paulovitorjp 安装后你是如何在/resources/app.asar.unpacked/my-folder 设置python环境的。如果 python 和所有必需的模块都没有出现在适当的版本中,则 python 不会运行。【参考方案2】:

您可以将脚本包含在extraResources:

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

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

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

【讨论】:

在这种情况下,app 变量是什么?或者它来自哪里?我假设路径来自内置路径模块的nodejs,但什么是应用程序 app 来自需要 electron 包。 const app = require("electron");And here's the docs on app.getAppPath.

以上是关于在 Electron 应用程序中运行 python 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Python + Electron JS 编译成桌面应用程序(exe)

在运行的应用程序中查看 electron-builder 的构建目标

Electron NPM 应用程序找不到 file:///eel.js,但 python 可以

Electron 框架中调用 Python 构建桌面应用

如何在docker中运行electron

我可以在 Electron.js 应用程序中捆绑 Pepper Flash 以在 2021+ 年运行 Flash 吗?