我有一个python程序,它使用pyinstaller生成我构建到exe的mysql调用。使用pyinstaller的--onefile或--onedir编译时会出现以下问题。
我已经能够使用mysqldb或mysql.connector来成功连接和进行查询。
这是mysqldb连接逻辑:
# from http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python
try:
db = MySQLdb.connect(host=hostname,user=username,passwd=password)
except MySQLdb.Error as e:
reply = QtGui.QMessageBox.critical(self, "Error",str(e.args[1]))
return
这是mysql.connector连接逻辑:
# http://dev.mysql.com/
try:
db = mysql.connector.connect(host=hostname,user=username,password=password)
except mysql.connector.Error as e:
reply = QtGui.QMessageBox.critical(self, "Error",str(e.msg))
return
如果我提供了错误的主机地址,则在两次连接调用期间都会抛出“except”,并且会捕获并显示错误消息。在使用pyinstaller编译之前,这对两个连接器都能正常工作。
但是,mysql.connector“except”不会出现在我的程序的编译版本中。 “except”对mysqldb connect调用正常工作,并显示错误消息。
这让我得出结论,mysql.connector有一个bug。其他人可以证实这一点,还是我做错了什么?
所有这些工具(pyinstaller,py2app,py2exe)都不像你想象的那样支持try/except
。
生成的代码具有(应该具有)try
和except
子句,但是为了推断程序实际需要哪些模块,仅评估一个分支。
这可能会对动态加载造成各种各样的破坏。
简单而强硬的修复方法是直接包含所有相关的导入,例如:
import mysql
import mysql.connector
import mysql.secret_lazy_loaded_submodule
import QtGui
import QtGui.QMessageBox
import QtGui.secret_lazy_loaded_submodule
try:
mysql.connector.foo()
except Exception:
QtGui.QMessageBox.foo()
我正在为可见性添加这个答案,因为我的部分解决方案隐藏在评论中。
我遇到了同样的问题,错误的追溯是这样的:
Traceback (most recent call last):
File "main.pyw", line 239, in start
File "database.py", line 89, in connected
File "database.py", line 57, in __enter__
File "site-packages\mysql\connector\__init__.py", line 173, in connect
File "site-packages\mysql\connector\connection.py", line 102, in __init__
File "site-packages\mysql\connector\abstracts.py", line 731, in connect
File "site-packages\mysql\connector\connection.py", line 244, in _open_connection
File "site-packages\mysql\connector\network.py", line 518, in open_connection
File "site-packages\mysql\connector\errors.py", line 187, in __init__
File "site-packages\mysql\connector\locales\__init__.py", line 60, in get_client_error
AttributeError: 'module' object has no attribute 'client_error'
与评论一样,导入是:
import mysql.connector.locales.eng.client_error