Pyinstaller 创建的 exe 有一个 AttributeError

问题描述 投票:0回答:1

我使用以下命令使用 pyinstaller 创建了一个 exe 文件:

pyinstaller --name BrewTwin --onefile --add-data "models;models" --add-data "needed_data;needed_data" --add-data "icons;icons" --windowed --icon=icons/brewTwin_logo.ico brewTwin_brand_new.py

在创建过程中没有记录任何失败,但是当我想通过 exe 文件启动程序时,我收到一个 AttributeError: 'NoneType' object has no attribute 'write' 当我在 IDE 中运行程序时,我没有得到该属性错误。 此错误发生在以下代码行中:

self.firstoutput = self.model.predict(tf.convert_to_tensor(self.firstpredict, dtype=tf.float32))

有关我的程序的一些信息: 我在 python 3.9 中使用 tkinter 编写了一个 GUI 类,该代码行位于我类的 init 方法中。我加载的模型是 Keras LSTM 网络,我使用

keras.models.load_model(resource_path(model_path), compile=False)

加载它

整个错误信息是:

Traceback (most recent call last):
  File "brewTwin_brand_new.py", line 1117, in <module>
  File "brewTwin_brand_new.py", line 50, in __init__
  File "keras\src\utils\traceback_utils.py", line 70, in error_handler
  File "keras\src\utils\traceback_utils.py", line 65, in error_handler
  File "keras\src\engine\training.py", line 2575, in predict
  File "keras\src\callbacks.py", line 519, in on_predict_batch_end
  File "keras\src\callbacks.py", line 322, in _call_batch_hook
  File "keras\src\callbacks.py", line 345, in _call_batch_end_hook
  File "keras\src\callbacks.py", line 393, in _call_batch_hook_helper
  File "keras\src\callbacks.py", line 1101, in on_predict_batch_end
  File "keras\src\callbacks.py", line 1170, in _batch_update_progbar
  File "keras\src\utils\generic_utils.py", line 296, in update
  File "keras\src\utils\io_utils.py", line 79, in print_msg
AttributeError: 'NoneType' object has no attribute 'write'

如果需要任何进一步的信息,请告诉我。

python keras model pyinstaller exe
1个回答
0
投票

对于可能遇到相同或类似问题的其他人:我自己找到了解决方案。

我只需要通过添加以下代码行来抑制tensorflow和keras模块的控制台输出:

import sys
import os
import tensorflow as tf
import keras.models import load_model

if getattr(sys, "frozen", False) and hasattr(sys, "_MEIPASS"):
    # Change the standard output
    sys.stdout = open(os.devnull, 'w')
    sys.stderr = open(os.devnull, 'w')
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
    tf.get_logger().setLevel('ERROR')
    logging.getLogger('tensorflow').setLevel(logging.ERROR)

使用 if 语句,我确保开发时控制台中有标准输出。

© www.soinside.com 2019 - 2024. All rights reserved.