如何使用 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 的 PyInstaller
为 python-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 的完整构建脚本,请参阅:
当我使用 PyInstaller 构建我的应用程序时,如何包含 gpg
(及其所有依赖项)?
我将我的 python 应用作为 Linux、Windows 和使用 PyInstaller
的 MacOS 的独立可执行文件发布。我需要使用 gpg
,所以我正在使用 python-gnupg
模块——它基本上只是将系统上本地安装的 gpg
二进制文件打包。
因为我的应用程序被设计为“可移植”可执行文件(我使用 PyInstaller
将其与 python
解释器和所有其他依赖项一起发送),我想包含 gpg
与我的版本一起使用,因此用户不必在他们的机器上安装它。
如何使用针对 Linux、Windows 和 MacOS 的 PyInstaller
为 python-gnupg
模块添加 gpg
二进制文件及其所有依赖项?
您可以通过添加 gpg
二进制文件及其所有依赖项 using the Analysis.datas
key.
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 的完整构建脚本,请参阅: