使用pyinstaller和pysqlcipher创建一个文件exe时出现问题

2022-03-24 00:00:00 python pyinstaller pysqlite pysqlcipher

问题描述

我正在尝试创建一个文件.exe,以便在任何Windows计算机上运行,但我遇到了pysqlcipher的问题。我又回到了一些基本的代码,这些代码只是用一个键创建一个简单的数据库,在我的dev机器上,无论我使用python文件还是编译后的exe,都运行得很好。我似乎错过了一个图书馆、一条小路,还是两者兼而有之?我尝试过使用--add-data添加很多项目,但是花费了几个小时,没有取得任何进展。以下是python的基本代码:-

from pysqlcipher3 import dbapi2 as sqlite
import os
import sys

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

conn = sqlite.connect('test.db')
c = conn.cursor()
c.execute("PRAGMA key='password'")
c.execute('''create table stocks (date text, trans text, symbol text, qty real, price real)''')
c.execute("""insert into stocks values ('2006-01-05','BUY','RHAT',100,35.14)""")
conn.commit()
c.close()

当我在另一台Windows 10 PC上运行exe时,出现此错误

回溯(最近一次呼叫): 文件"testdb.py",行1,位于 EXEC_"c:usersxxxappdatalocalprogramspythonpython38libsite-packagesPyInstallerloaderpyimod03_importers.py",中的文件第623行 文件"site-packagespysqlcipher3-1.0.3-py3.8-win-amd64.eggpysqlcipher3dbapi2.py",行33,在 ModuleNotFoundError:没有名为""pysqlcipher3._sqlite3""的模块"" [9248]无法执行脚本testdb

该错误引用我的dev PC上的路径,还引用dbapi2.py中的第33行,即:-

from pysqlcipher3._sqlite3 import *

我尝试在运行pyinstaller时添加各种文件,但没有任何进展,我确信这不是一件简单的事情,但需要帮助。


解决方案

不久前我遇到过类似的问题,有一件事对我很有效,那就是在pyinstaller的规范文件中添加sqlite3DLL。也可以从命令行添加它。我以前尝试过很多其他方法,比如重新创建一个conda环境和重新构建我的python包,但都不起作用。在添加pyinstaller二进制文件的规范文件中,请尝试类似。

binaries=[('C:\Users\myname\newfolder\sqlite3.dll','.')]

您可以从https://www.sqlite.org/download.html下载DLL,具体取决于Windows或Linux平台。一旦添加了DLL并重新编译,应该就可以了。我认为这个错误主要是在dbapi2请求sqlite3DLL时发生的,在我的例子中,DLL文件夹中至少缺少该DLL。我刚刚下载并将其添加到规范文件中,但您也可以尝试将其添加到挂钩路径或ENV文件夹中。

相关文章