使用 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 编写了一个程序(pyodbc
和tkinter
)。我使用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 后如何在启动时修复错误?的主要内容,如果未能解决你的问题,请参考以下文章
使用 pyinstaller 编译时“除外”期间的 mysql.connector 错误?