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

问题描述 投票:4回答:2

我有一个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。其他人可以证实这一点,还是我做错了什么?

python mysql mysql-python mysql-connector pyinstaller
2个回答
7
投票

所有这些工具(pyinstaller,py2app,py2exe)都不像你想象的那样支持try/except

生成的代码具有(应该具有)tryexcept子句,但是为了推断程序实际需要哪些模块,仅评估一个分支。

这可能会对动态加载造成各种各样的破坏。

简单而强硬的修复方法是直接包含所有相关的导入,例如:

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()

0
投票

我正在为可见性添加这个答案,因为我的部分解决方案隐藏在评论中。

我遇到了同样的问题,错误的追溯是这样的:

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

© www.soinside.com 2019 - 2024. All rights reserved.