如何将 Python + Electron JS 编译成桌面应用程序 (exe)
How to compile Python + Electron JS into desktop app (exe)
我创建了一个桌面应用程序,使用 python 作为后端,Electron JS 与 Node JS 集成作为前端 .
下图是我项目的文件树。
我能够使用 renderer.js
文件 link 使用 Electron JS python 并且我的应用程序按预期运行。
但我的问题是,我应该如何将这个 Python + Electron JS 应用程序编译成 exe
。我知道 pyinstaller
可用于将 python 文件编译为 exe
。请让我知道如何编译此 python + electron JS
应用程序。
提前致谢。
所以经过一番研究,我自己找到了解决方案。
第 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.
第 3 步:使用 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位架构。
--asar
以阻止大多数人查看您的源代码的方式打包您的项目。无论如何,几乎所有人都可以通过检查 Electron 转储的 asar
文件来查看源代码。您可以尝试代码混淆之类的方法来减慢攻击者的逆向工程速度。
关于代码混淆的有用资源 -
github - https://github.com/electron/electron-packager/issues/152
中报告了类似问题
第 4 步:将我们的 engine.exe
放在正确的目录中
复制我们之前创建的 engine.exe
并将其粘贴到创建电子应用程序的文件夹中。就我而言,pythonElectronApp-win32-x64
现在您可以打开功能齐全的 python+electron
应用程序。在我的例子中,名字是 pythonElectronApp.exe
第 5 步:创建主安装程序文件.msi
正如您之前在上图中看到的那样,有很多依赖项和文件夹。要为 windows 创建一个像 .msi
这样的独立安装程序,您可以使用像 Inno Setup 这样的软件来为您完成。
取决于你真正想要什么。如果你只想要 python 的网络前端,那么你可以跳过 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 与 Node JS 集成作为前端 .
下图是我项目的文件树。
我能够使用 renderer.js
文件 link 使用 Electron JS python 并且我的应用程序按预期运行。
但我的问题是,我应该如何将这个 Python + Electron JS 应用程序编译成 exe
。我知道 pyinstaller
可用于将 python 文件编译为 exe
。请让我知道如何编译此 python + electron JS
应用程序。
提前致谢。
所以经过一番研究,我自己找到了解决方案。
第 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.
第 3 步:使用 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位架构。
--asar
以阻止大多数人查看您的源代码的方式打包您的项目。无论如何,几乎所有人都可以通过检查 Electron 转储的 asar
文件来查看源代码。您可以尝试代码混淆之类的方法来减慢攻击者的逆向工程速度。
关于代码混淆的有用资源 -
github - https://github.com/electron/electron-packager/issues/152
中报告了类似问题第 4 步:将我们的 engine.exe
放在正确的目录中
复制我们之前创建的 engine.exe
并将其粘贴到创建电子应用程序的文件夹中。就我而言,pythonElectronApp-win32-x64
现在您可以打开功能齐全的 python+electron
应用程序。在我的例子中,名字是 pythonElectronApp.exe
第 5 步:创建主安装程序文件.msi
正如您之前在上图中看到的那样,有很多依赖项和文件夹。要为 windows 创建一个像 .msi
这样的独立安装程序,您可以使用像 Inno Setup 这样的软件来为您完成。
取决于你真正想要什么。如果你只想要 python 的网络前端,那么你可以跳过 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.