在 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 的构建目标