Python脚本转PyInstaller exe后报TypeError错误求助
解决PyInstaller打包后Pandas列值全为None及字符串拼接错误的问题
一、先修复字符串拼接的直接错误
不管数据为何变成None,先给代码添加防御性处理,彻底避免TypeError:
修改pix_replace函数,将可能为None的字段转为空字符串,并优化拼接逻辑:
def pix_replace(row): value = row['fund_transaction_type'] orides_nome = row['orides_nome'] or "" # None转空字符串 orides_taxid_masked = row['orides_taxid_masked'] or "" transaction_type = row['TRANSACTION_TYPE'] if value not in [17, 18, 34, 57]: return transaction_type # 按需拼接税号部分,避免空值干扰 taxid_segment = f" - {orides_taxid_masked}" if orides_taxid_masked else "" if value == 17: return f'PIX ENVIADO PARA \n {orides_nome.upper()}{taxid_segment}' if value in [18, 34]: return f'PIX RECEBIDO DE \n {orides_nome.upper()}{taxid_segment}' if value == 57: return 'PIX RETORNADO'
二、排查打包后orides_taxid_masked列全为None的根源
1. 确保PyInstaller打包依赖完整
PyInstaller可能漏掉PyHive/Presto的底层依赖,打包时显式指定缺失模块:
# 显式导入关键依赖 pyinstaller --onefile --hidden-import pyhive.presto --hidden-import thrift --hidden-import thrift.protocol --hidden-import thrift.transport gerador_extrato.py # 或直接收集PyHive所有关联文件 pyinstaller --onefile --collect-all pyhive gerador_extrato.py
2. 验证虚拟环境打包的完整性
激活虚拟环境后,确认安装了所有必要依赖:
pip install pyhive presto pandas tkinter pyinstaller thrift thrift-sasl
确保打包过程完全基于虚拟环境,避免系统环境包的干扰。
3. 对比打包前后的查询结果
在脚本中添加调试代码,输出原始数据用于对比:
# 查询完成后添加 print("列数据类型:", df['orides_taxid_masked'].dtype) print("列样本值:", df['orides_taxid_masked'].head(10)) # 保存原始数据到文件 df.to_csv('debug_raw_data.csv', index=False)
打包后运行exe,查看生成的debug_raw_data.csv,确认是Presto查询返回结果本身为None,还是Pandas解析时出现异常。
4. 排查Thrift兼容性问题
PyHive依赖Thrift通信,打包后可能存在版本兼容问题:
- 固定Thrift版本为兼容PyHive的稳定版:
pip install thrift==0.13.0 - 重新打包,确保Thrift的序列化组件被完整包含。
三、额外调试技巧
- 优先用
--onedir模式打包,便于检查打包后的文件结构,确认是否缺失PyHive/Presto的关键文件。 - 在exe运行时添加日志记录,把查询SQL、结果元数据写入日志文件,对比开发环境与打包环境的差异。
内容的提问来源于stack exchange,提问作者João Victor Carvalho
相关产品推荐
相关产品推荐

