You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:15:32