使用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
相关产品推荐
相关产品推荐

