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

使用PyInstaller将Python脚本转为.exe后无输出问题求助

问题描述

将Python脚本通过PyInstaller转换为.exe文件后,程序无任何输出,但原脚本在Spyder和CMD中运行完全正常,可正常查询PostgreSQL数据库并打印邮箱列表。PyInstaller打包过程无报错,尝试过添加多个hidden-import、切换单文件/多文件模式,甚至使用auto-py-to-exe工具,问题仍未解决。

原Python代码:

import psycopg2

try:
    # 连接PostgreSQL
    conn = psycopg2.connect(
        dbname="xxxx",
        user="xxxx",
        password="xxxx",
        host="postgresql-xxxx-xxxx.xxxx.xxxx",
        port="xxxx"  # PostgreSQL默认端口
    )

    # 创建游标执行SQL命令
    cursor = conn.cursor()

    # 执行查询
    cursor.execute("SELECT email FROM membre")
    
    # 获取结果
    rows = cursor.fetchall()

    # 打印结果
    for row in rows:
        print(row)

except Exception as e:
    print(f"发生错误:{e}")

finally:
    # 关闭游标和连接
    if cursor:
        cursor.close()
    if conn:
        conn.close()

使用的打包命令:

pyinstaller --onefile --hidden-import=psycopg2 --hidden-import=psycopg2._psycopg --hidden-import=psycopg2.extensions --hidden-import=psycopg2.extras --hidden-import=sqlalchemy.dialects.postgresql --hidden-import=sqlalchemy.dialects.postgresql.psycopg2 creation_userform_sans_sql.py
解决方案
  • 在CMD中手动运行.exe:双击.exe会导致窗口一闪而过,无法查看报错信息。打开CMD,导航到.exe所在目录,手动执行文件,直接查看终端输出的错误详情。
  • 补充psycopg2依赖的动态库:psycopg2依赖PostgreSQL的libpq.dll,PyInstaller可能未自动包含该文件。从PostgreSQL安装目录的bin文件夹中找到libpq.dll,复制到.exe同目录;或打包时用--add-binary参数指定路径:
    pyinstaller --onefile --add-binary "C:\Program Files\PostgreSQL\15\bin\libpq.dll;." --hidden-import=psycopg2._psycopg creation_userform_sans_sql.py
    
  • 精简hidden-import项:原脚本未使用sqlalchemy,删除相关hidden-import参数,仅保留--hidden-import=psycopg2._psycopg即可,这是psycopg2的核心依赖项。
  • 切换为多文件模式打包:单文件模式易出现动态库加载异常,用--onedir替换--onefile,生成包含所有依赖的文件夹,运行其中的.exe文件。
  • 强制显示控制台窗口:若打包时误加--windowed或--noconsole参数,会隐藏控制台导致看不到输出。确保命令中无此类参数,或显式添加--console强制弹出控制台。
  • 添加日志记录错误:修改脚本,将错误信息写入日志文件,即使控制台无输出也能排查问题:
    import psycopg2
    import traceback
    
    try:
        # 原连接与查询代码
        conn = psycopg2.connect(...)
        # 后续逻辑不变
    except Exception as e:
        with open("error_log.txt", "w", encoding="utf-8") as f:
            f.write(f"错误信息:{str(e)}\n")
            f.write(traceback.format_exc())
    finally:
        # 原关闭游标与连接代码
    

内容的提问来源于stack exchange,提问作者seblenor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 12:42:37