使用 PyInstaller 编译得到 pyodbc 后如何在启动时修复错误?

Posted

技术标签:

【中文标题】使用 PyInstaller 编译得到 pyodbc 后如何在启动时修复错误?【英文标题】:How to fix an error at start after compiling with PyInstaller got pyodbc? 【发布时间】:2012-09-20 14:41:45 【问题描述】:

我用 python 编写了一个程序(pyodbctkinter)。我使用pyodbc 连接到Microsoft Access 数据库。

有连接代码:

import pyodbc

# Microsoft Access Database File
DBfile = 'GDP.mdb'
conn = pyodbc.connect('DRIVER=Microsoft Access Driver (*.mdb);DBQ='+DBfile)

当我在命令提示符 (python myprogram.py) 中编译之前启动它时,它运行良好。使用pyinstaller编译时一切正常,没有报错。

但是当尝试启动可执行文件时,它会显示主窗口 2 秒钟然后消失。

当我在pyinstaller 中使用-d 标志打开调试模式时,它在启动可执行文件时显示以下错误:

Traceback (most recent call last):
File "<string>", line 62, in <module>
  pyodbc.Error: (
     'HY000', "[HY000] [Microsoft][Driver ODBC Microsoft Access]
     Can't find File'(Unknown)'. 
     (-1811) (SQLDriverConnect); [HY000] [Microsoft][Driver ODBC Microsoft Access]
     Can't find File'(Unknown)'.
     (-1811)")
RC: -1 from main

编辑 第一个错误消失了,得到一个新的:

Traceback (most recent call last):
    File "", line 78, in 
File "path\to\my\program\ build\pyi.win32\GDP\outPYZ1.pyz/Tkinter", line 1564, in wm_iconbitmap
_tkinter.TclError: bitmap "icon.ico' not defined
RC: -1 from main

【问题讨论】:

编辑:问题标题中不欢迎“紧急”。我们都有忙碌的生活。 【参考方案1】:

您需要使用绝对文件名,而不是本地文件:

import os

try:
    currdir = os.path.dirname(os.path.abspath(__file__))
except NameError:  # We are the main py2exe script, not a module
    import sys
    currdir = os.path.dirname(os.path.abspath(sys.argv[0]))
DBfile = os.path.join(currdir, 'GDP.mdb')

【讨论】:

上面@Martijn Pieters 的解决方案诊断出我的问题(我需要将我的Access db 的文件名更改为绝对文件名),但我不得不根据我的情况调整他的解决方案。当我按照他的指示加入当前目录然后打印终端的路径时,我看到它在路径中包含了我的 .py 文件的名称,这是不正确的,可能是因为我正在导入打开的函数并且将数据库读入该文件。当我硬编码正确的绝对路径时,它工作得很好。谢谢马丁! @jenstreetman:是的,有一个 os.path.dirname() 呼叫丢失,现在添加。

以上是关于使用 PyInstaller 编译得到 pyodbc 后如何在启动时修复错误?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt 膨胀和 Pyinstaller

Python:使用 Pyinstaller 编译

使用 pyinstaller 编译时“除外”期间的 mysql.connector 错误?

PyInstaller打包、解包与反编译.pyc文件

使用 pyinstaller [eel] 编译应用程序时出错

Pyinstaller没有编译joblib