我使用以下命令使用 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'
如果需要任何进一步的信息,请告诉我。
对于可能遇到相同或类似问题的其他人:我自己找到了解决方案。
我只需要通过添加以下代码行来抑制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 语句,我确保开发时控制台中有标准输出。