如何将 Python + Electron JS 编译成桌面应用程序(exe)
Posted
技术标签:
【中文标题】如何将 Python + Electron JS 编译成桌面应用程序(exe)【英文标题】:How to compile Python + Electron JS into desktop app (exe) 【发布时间】:2021-07-12 17:52:23 【问题描述】:我使用python作为后端和与Node JS集成的Electron JS作为前端创建了一个桌面应用程序。
下图是我项目的文件树。
我能够使用 renderer.js
文件将 python 与 Electron JS 链接起来,并且我的应用程序按预期运行。
但我的问题是,我应该如何将这个 Python + Electron JS 应用程序编译成 exe
。我知道 pyinstaller
可用于将 python 文件编译为exe
。请告诉我如何编译这个python + electron JS
应用程序。
提前致谢。
【问题讨论】:
我找到了一些关于如何从 python 创建可执行文件的材料,可能会有所帮助***.com/questions/12059509/… 但它没有回答节点部分,抱歉。 感谢有关 python 编译的线程。如果您发现有关我的问题的任何可能有用的资源,请告诉我。 前端的 html+CSS+javascript + 后端的 Python 在 Tauri 路线图上。目前 PyQt 是一个更好的解决方案。 【参考方案1】:所以经过一番研究,我自己找到了解决方案。
第一步:将python文件编译成exe
首先,您需要使用pyinstaller
将python
文件转换为单个exe
。命令是
pyinstaller --onefile engine.py
您会在dist
文件夹中找到engine.exe
。将exe
复制到您拥有renderer.js
的主目录中。删除所有其他与 python 相关的文件夹。
第 2 步:修改 renderer.js
文件
最初,我有一个带有以下代码的renderer.js
文件。 注意: 以下代码用于运行我的 python 脚本,使用 sys.argv
作为输入并使用 stdout
获取输出。
function sendToPython()
var python = require("child_process").spawn("python", [
"./py/engine.py",
input.value,
]);
python.stdout.on("data", function (data)
// Do some process here
);
python.stderr.on("data", (data) =>
console.error(`stderr: $data`);
console.log(`stderr: $data`);
);
python.on("close", (code) =>
console.log(`child process exited with code $code`);
);
但是现在我们已经生成了exe
文件,我们需要进行一些修改才能使其正常工作。我们只需要换行即可。
var python = require("child_process").spawn("python", ["./py/engine.py", input.value]);
以下是该行的修改版本。
var python = require("child_process").execFile("engine.exe", [input.value]);
简而言之,它的作用是使用命令行参数执行我们的engine.exe
,而不产生python shell。
第三步:使用electron-packager
打包我们的应用
在您的项目文件夹中打开一个终端并运行以下命令(一个接一个)以使用npm
全局安装electron-packager
。
npm install --save-dev electron
npm install electron-packager -g
安装完成后,我们可以使用以下命令打包我们的应用程序。
electron-packager . pythonElectronApp --arch=x64 --asar
注意:pythonElectronApp
是项目名称(你可以根据自己的意愿命名),--arch=x64
表示64位架构。 p>
--asar
以一种阻止大多数人查看您的源代码的方式打包您的项目。无论如何,几乎所有人都可以通过检查 Electron 转储的asar
文件来查看源代码。您可以尝试代码混淆等方法来减缓攻击者进行逆向工程的速度。
关于代码混淆的有用资源 - How to perform obfuscation of source code and protect source in electron js
github 中报告了类似问题 - https://github.com/electron/electron-packager/issues/152
第 4 步:将我们的 engine.exe
放在正确的目录中
复制我们之前创建的engine.exe
并将其粘贴到创建电子应用程序的文件夹中。就我而言,pythonElectronApp-win32-x64
现在您可以打开功能齐全的python+electron
应用程序。在我的例子中,名字是pythonElectronApp.exe
第五步:创建一个主安装文件.msi
正如您在上一张图片中看到的,有很多依赖项和文件夹。要为 Windows 创建像 .msi
这样的独立安装程序,您可以使用像 Inno Setup 这样的软件来为您完成。
【讨论】:
这是一个非常有限的解决方案,因为您只能生成一个没有通信的 exe 文件,我知道这将如何与大型项目一起使用。 如果您有更好的实施方法,请提出其他解决方案。【参考方案2】:取决于你真正想要什么。如果你只想要一个 Python 的 Web 前端,那么你可以一起跳过 Electron 并使用CEF Python。 Here's another thread about compiling python exes with CEF Python。 And here's the PyInstaller example from the CEF Python repo.
【讨论】:
以上是关于如何将 Python + Electron JS 编译成桌面应用程序(exe)的主要内容,如果未能解决你的问题,请参考以下文章
Electron NPM 应用程序找不到 file:///eel.js,但 python 可以
使用 Excel 电子表格作为数据库的 Electron-Python 应用程序:使用 npm 包 - database-js-xlsx 进行 CRUD 操作