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

使用PyInstaller打包TensorFlow应用时.predict()方法报错求助

解决PyInstaller打包TensorFlow应用时predict()的AttributeError问题

问题描述

用PyInstaller打包包含TensorFlow的Python应用,编译过程正常,TensorFlow可正常导入,h5模型加载也无问题,但运行打包后的程序调用model.predict()方法时,弹出错误:

AttributeError: 'NoneType' object has no attribute 'write'

原代码

import tensorflow as tf 
modelo = tf.keras.models.load_model("model.h5") 
numeros_variados = tf.random.uniform(shape=(1, 30), minval=2, maxval=11, dtype=tf.int32)
y_pred= modelo.predict(numeros_variados) 
print(y_pred) 

完整报错栈

Traceback (most recent call last):
  File "main.py", line 37, in <module>
    y_pred= modelo.predict(numeros_variados)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "keras\src\utils\traceback_utils.py", line 122, in error_handler
  File "keras\src\utils\traceback_utils.py", line 119, in error_handler
  File "keras\src\backend\tensorflow\trainer.py", line 506, in predict
  File "keras\src\callbacks\callback_list.py", line 126, in on_predict_batch_end
  File "keras\src\callbacks\progbar_logger.py", line 66, in on_predict_batch_end
  File "keras\src\callbacks\progbar_logger.py", line 95, in _update_progbar
  File "keras\src\utils\progbar.py", line 182, in update
  File "keras\src\utils\io_utils.py", line 98, in print_msg
AttributeError: 'NoneType' object has no attribute 'write'

问题原因

错误源于Keras的ProgbarLogger回调尝试写入标准输出(stdout),但打包后的程序在无控制台环境下,stdout被设置为None,导致调用write()方法时触发异常。

解决方法

方法1:禁用predict的进度条输出

调用predict()时添加verbose=0参数,彻底跳过进度条的生成和输出逻辑:

y_pred = modelo.predict(numeros_variados, verbose=0)

方法2:初始化标准输出

在程序开头添加代码,确保stdout/stderr被正确初始化:

import sys

# 恢复标准输出/错误流
if sys.stdout is None:
    sys.stdout = sys.__stdout__
if sys.stderr is None:
    sys.stderr = sys.__stderr__

如果不需要控制台输出,也可以将输出导向空设备:

import sys
import os

if sys.stdout is None:
    sys.stdout = open(os.devnull, 'w')
if sys.stderr is None:
    sys.stderr = open(os.devnull, 'w')

方法3:打包时指定控制台模式

使用PyInstaller打包时,添加--console参数(Windows平台),强制程序运行时创建控制台窗口,保证stdout正常可用:

pyinstaller --console main.py

验证

修改代码或打包参数后,重新打包运行程序,model.predict()即可正常执行并输出预测结果。

内容的提问来源于stack exchange,提问作者Jesus Peña

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:53:13