【问题标题】:sqlite + PyQt5 to standalone exe - Python 3.6.3 + Pyinstallersqlite + PyQt5 到独立 exe - Python 3.6.3 + Pyinstaller
【发布时间】:2017-11-04 19:33:29
【问题描述】:

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

这是我的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 )

谢谢

【问题讨论】:

  • 我不确定您是否可以在可执行文件 (exe) 中添加 sqlite 数据库 (db) 文件。存储数据库文件的位置取决于您,但根据我的经验,我建议将其存储在某个操作系统文件夹中,例如:~/Library/Application Support/<APPNAME> (OS X) 或 C:/Users/<USER>/AppData/Local/<APPNAME> (Windows)。请看一下 QStandardPaths。另一个提示:在你的问题中,你说it doesn't workit doesn't work 没有任何意义。您需要指定正在发生的事情、遇到的错误等。
  • 我的目标是共享我的可执行文件 (exe),我担心如果用户将 exe 移动到另一个没有 db 的文件夹中,则会产生错误。另一种方法是开发一个完整的安装过程,但我不知道这是否可以通过pyinstaller 完成。
  • 如果你使用标准路径,正如我提到的,并动态创建数据库,你不需要担心可执行文件在哪里。
  • 例如:当用户打开应用程序时,必须检查文件夹中是否存在数据库文件:C:/Users/<USER>/AppData/Local/<APPNAME>。如果它不存在,则需要使用作为资源包含在应用程序中的 SQL 文件来创建它。您可以使用pragma user_version 来控制下一个版本的数据库版本。请注意,使用 QStandardPaths 数据库文件将始终位于同一文件夹中,无论您的可执行文件在哪里。 (这只是一个例子,还有其他方法)
  • 谢谢你,我理解你的解释背后的逻辑。作为一名 Python 新手,我需要做更多的研究,但我只想确认一件事:存储 db 的路径、第一次打开的预填充 db 等。这些元素必须在规范文件中指定。对吗?

标签: python sqlite pyqt5 pyinstaller


【解决方案1】:

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

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

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

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/*

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

然后在分析中,

datas = added_files

一个彻底的答案很长。我写了this article 来详细说明我为解决这个问题所经历的事情。

【讨论】:

    猜你喜欢
    • 2017-03-07
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多