sqlite + PyQt5 到独立 exe - Python 3.6.3 + Pyinstaller

2022-01-12 00:00:00 python pyinstaller pyqt5 sqlite

我想用 Pyinstaller 创建一个 exe,包括一个数据库 (.db) 和一个图片 (.png).我希望将所有内容都放入一个 single exe (--onefile).我试图直接在 spec 文件中添加两个元素的路径,但它不起作用.

I would like to create an exe with Pyinstaller including a database (.db) and a picture (.png). I want everything into a single exe (--onefile). I tried to add the path of both elements directly in the spec file but it doesn't work.

这是我的 spec 文件:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['back_end.py'],
             pathex=['C:\Users\...\site-packages\PyQt5\Qt\bin', 'C:\Users\...\Test_packaging'],
             binaries=[],
             datas=['C:\Users...\Test_packaging\database1.db', 'C:\Users...\Test_packaging\picture1.png'],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='back_end',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=False )

谢谢

推荐答案

您必须解决许多问题才能使其正常工作.例如:

You have to solve many issues to get this working. For example:

  • 获取正确的资源路径
  • 添加数据

第一个问题通过根据执行模式调整路径来解决.

The first issue is solved by adjusting paths depending on execution mode.

def app_path(path):
    frozen = 'not'
    if getattr(sys, 'frozen', False):
            # we are running in executable mode
            frozen = 'ever so'
            app_dir = sys._MEIPASS
    else:
            # we are running in a normal Python environment
            app_dir = os.path.dirname(os.path.abspath(__file__))
    return os.path.join(app_dir, path)

第二个问题是有效地包含您需要的内容.起初显而易见的解决方案是手动添加每个图像和数据库,但我有很多图像.我转向使用通配符运算符 (*) 的规范文件方式在文件夹中添加我需要的内容,而不是添加 folder/*.

The second issue is efficiently including what you need. At first the obvious solution is to add each image and db manually, but i had lots of image. I turned to the spec file way using the wildcard operator (*) to add what i need in folder than adding folder/*.

added_files = [
         ( './pics/*', 'pics' ),
         ( './db/*', 'db' ),
         ]

然后在分析中,

datas = added_files

一个彻底的答案很长.我已经写了 这篇文章 显示我为解决问题所经历的一些细节.

A thorough answer is quite long. I've written this article to show in some minute details what i went through to solve the issue.

相关文章