如何将 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

首先,您需要使用pyinstallerpython 文件转换为单个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 框架中调用 Python 构建桌面应用

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

设置窗口标题栏的颜色 - electron.js

使用 Excel 电子表格作为数据库的 Electron-Python 应用程序:使用 npm 包 - database-js-xlsx 进行 CRUD 操作

Electron + xmpp.js:如何调试 SSL 自签名错误消息?

在 Electron 中执行 unix 可执行文件(python)