如何使用 GnuPG (gpg) 可执行文件和依赖项 (PyInstaller) 冻结 python 应用程序

How to freeze python app with GnuPG (gpg) executable and dependencies (PyInstaller)

当我使用 PyInstaller 构建我的应用程序时,如何包含 gpg(及其所有依赖项)?

我将我的 python 应用作为 Linux、Windows 和使用 PyInstaller 的 MacOS 的独立可执行文件发布。我需要使用 gpg,所以我正在使用 python-gnupg 模块——它基本上只是将系统上本地安装的 gpg 二进制文件打包。

因为我的应用程序被设计为“可移植”可执行文件(我使用 PyInstaller 将其与 python 解释器和所有其他依赖项一起发送),我想包含 gpg 与我的版本一起使用,因此用户不必在他们的机器上安装它。

如何使用针对 Linux、Windows 和 MacOS 的 PyInstallerpython-gnupg 模块添加 gpg 二进制文件及其所有依赖项?

您可以通过添加 gpg 二进制文件及其所有依赖项 using the Analysis.datas key.

将 GnuPG 与 PyInstaller-built 应用程序打包在一起

Windows

在 windows,我通过反复试验得到了它。首先,我只是在整个系统中搜索 gpg.exe 二进制文件。在 powershell 中:

> Get-Command gpg
0.0.0.0    C:\Program Files\Git\usr\bin\gpg.exe
> 

然后我通过更改此部分

将它添加到我的 PyInstaller .spec 文件中
a = Analysis(['..\src\main.py'],
             pathex=['.\'],
             binaries=[],
             datas=[],
             hiddenimports=['pkg_resources.py2_warn', 'libusb1'],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

进入这个

a = Analysis(['..\src\main.py'],
             pathex=['.\'],
             binaries=[],
             datas=
              [
               ('C:\Program Files\Git\usr\bin\gpg.exe', '.'),              ],
             hiddenimports=['pkg_resources.py2_warn', 'libusb1'],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

经过上述更改后,我的应用会弹出警告错误,例如:

The code execution cannot proceed because msys-bz2-1.dll was not found. Reinstalling the program may fix this problem.

One-by-one,我一直在寻找(如上所示在 powershell 中使用 Get-Command)并添加它抱怨的 .dll 文件,直到我在规范文件中的 datas上面有以下内容,有效:

             datas=
              [
               ( '..\KEYS', '.' ),
               ('C:\Program Files\Git\usr\bin\gpg.exe', '.'),
               ('C:\msys64\usr\bin\msys-bz2-1.dll', '.'),
               ('C:\msys64\usr\bin\msys-assuan-0.dll', '.'),
               ('C:\msys64\usr\bin\msys-gcrypt-20.dll', '.'),
               ('C:\msys64\usr\bin\msys-gpg-error-0.dll', '.'),
               ('C:\msys64\usr\bin\msys-2.0.dll', '.'),
               ('C:\msys64\usr\bin\msys-readline8.dll', '.'),
               ('C:\msys64\usr\bin\msys-z.dll', '.'),
               ('C:\msys64\usr\bin\msys-sqlite3-0.dll', '.'),
               ('C:\msys64\usr\bin\msys-iconv-2.dll', '.'),
               ('C:\msys64\usr\bin\msys-intl-8.dll', '.'),
               ('C:\msys64\usr\bin\msys-ncursesw6.dll', '.'),
              ],

您可以在此处查看我的完整构建脚本和 .spec 文件:

MacOS

在 MacOS 中,我发现我不需要添加任何依赖项——只需添加可执行文件。

             datas=[ ('/usr/local/bin/gpg', '.') ],

您可以在此处查看我的完整构建脚本和 .spec 文件:

Linux

我实际上没有使用 PyInstaller 为 Linux 构建版本,因为我使用的是 AppImage。

要查看 Linux 的完整构建脚本,请参阅: