py2exe打包后捕获psycopg2异常时出现AttributeError问题
解决py2exe打包后psycopg2.errors属性缺失问题
问题场景
在Windows控制台执行py script.py时,代码运行正常,插入已存在值会触发对应的except代码块;但使用py2exe打包成.exe后执行相同操作,出现异常报错。
相关代码片段
... query = f"INSERT INTO nichos VALUES {parameters}" try: run_query(query) print() print("Nicho agregado exitosamente.") print() if ret == 1: return cod_nicho except sql.errors.UniqueViolation: print() print(" ERROR. El nicho ya se encuentra cargado en el sistema. No se realizaron cambios en el registro.") if ret == 0: return elif ret == 1: return cod_nicho except: log_error() print("") input(" ERROR. Comuníquese con el administrador... Presione enter para continuar...") if ret == 0: return elif ret == 1: return cod_nicho ...
错误回溯信息
Traceback (most recent call last): File "funciones_mantenimiento.pyc", line 1459, in alta_nicho File "funciones_mantenimiento.pyc", line 160, in run_query psycopg2.errors.UniqueViolation: llave duplicada viola restricción de unicidad «sqlite_autoindex_nichos_1» DETAIL: Ya existe la llave (codigo)=(0202010036). During handling of the above exception, another exception occurred: Traceback (most recent call last): File "ventas.py", line 42, in <module> File "funciones_ventas.pyc", line 383, in menu File "funciones_ventas.pyc", line 1628, in menu_editar_op File "funciones_ventas.pyc", line 1823, in cambiar_nicho File "funciones_mantenimiento.pyc", line 1465, in alta_nicho AttributeError: module 'psycopg2' has no attribute 'errors'
解决方案
方案1:修改异常捕获逻辑
将代码中依赖psycopg2.errors的捕获语句,替换为直接捕获psycopg2根模块下的异常类,兼容性更强:
# 替换前 except sql.errors.UniqueViolation: # 替换后(二选一) except psycopg2.IntegrityError: # IntegrityError包含唯一约束、外键约束等所有完整性类错误 # 或版本支持的话直接指定具体异常 except psycopg2.UniqueViolation:
方案2:调整py2exe打包配置
如果要保留psycopg2.errors的用法,需在打包的setup.py中显式指定包含该子模块,避免py2exe遗漏打包:
from distutils.core import setup import py2exe setup( console=['ventas.py'], options={ 'py2exe': { 'packages': ['psycopg2', 'psycopg2.errors'], 'includes': ['psycopg2._psycopg'] # 显式包含psycopg2核心C扩展模块 } } )
方案3:统一psycopg2版本
检查开发环境与打包环境的psycopg2版本是否一致:
- 旧版本psycopg2没有
psycopg2.errors子模块,异常类直接定义在psycopg2根模块下 - 确保打包环境安装的psycopg2版本与开发环境完全相同,消除版本差异导致的异常结构不一致
内容的提问来源于stack exchange,提问作者Manu
相关产品推荐
相关产品推荐

