【问题标题】:How to freeze python app with GnuPG (gpg) executable and dependencies (PyInstaller)如何使用 GnuPG (gpg) 可执行文件和依赖项 (PyInstaller) 冻结 python 应用程序
【发布时间】:2020-08-18 17:12:08
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python python-3.x pyinstaller gnupg pgp


    【解决方案1】:

    您可以通过添加 gpg 二进制文件及其所有依赖项 using the Analysis.datas key 将 GnuPG 与 PyInstaller 构建的应用程序打包。

    窗口

    在 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.
    

    一个接一个,我一直在寻找(如上所示在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 完整构建脚本,请参阅:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      相关资源
      最近更新 更多