AttributeError:'NoneType'对象没有带有pyinstaller和tensorflow的属性'write'

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

我在使用 Pyinstaller 创建的 .exe 文件时遇到一些问题。我的代码创建了一个 CustomTkinter GUI,您可以在其中使用图像(具有多个光谱带的光栅图像)作为训练输入来训练神经 Tensorflow 模型,然后,您可以加载这些模型并对其他图像进行一些预测(我认为这是无关紧要的,但是我没有那么丰富的经验来确定这一点)。在我的 IDE 中,我的所有代码都运行良好(i.e. 加载图像的训练和预测),但是当我使用

pyinstaller --onedir -w main.py
制作 exe 文件并执行它时,我的预测不会出现,底层进程也不会出现预测部分停止后,但 GUI 仍将运行,并且我的程序执行的所有其他任务都可以正确完成,除了预测部分。

环境:

python==3.11.5
pyinstaller==6.1.0
tensorflow==2.12.0

这是错误的最小可重现示例:

import numpy as np 
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sys import exc_info

X_train = np.array([75, 36, -45, 127, 117, 97, 70, 120])
y_train = np.array([23.9, 2.2, -42.8, 52.8, 47.2, 36.1, 21.1, 48.9])

neural_model = Sequential()
neural_model.add(Dense(2, input_dim = 1, activation= 'sigmoid'))
neural_model.add(Dense(2, activation= 'sigmoid'))
neural_model.add(Dense(1, activation= 'linear'))

optimizer = tf.keras.optimizers.RMSprop(0.001)
neural_model.compile(
    optimizer = optimizer,
    loss = 'mse',
    metrics = ['mae', 'mse']
    )

history = neural_model.fit(X_train, y_train,
                        epochs=3,
                        batch_size=2,
                        verbose=False)
try:
    prediction_test = neural_model.predict([-49])

except Exception as e:
    file_name = '\somename.txt'
    file_path = r"somepath" + file_name
    with open(file_path, 'a') as txt:
        txt.write(f"An error occurred: {e}\n")
        error_type, error_value, traceback_info = exc_info()
        txt.write(f"Error type: {error_type}\n")
        txt.write(f"Error value: {error_value}\n")
        txt.write(f"Traceback: {traceback_info}\n")

然后,我在 vscode python 终端中编写以下命令来创建可执行文件:

pyinstaller --onedir -w scriptfilename.py

当我执行生成的.exe文件时,出现上述错误。

我强烈怀疑问题出在 model.predict 函数中。仔细检查我的代码后,我发现错误仅在 .exe 文件的执行期间发生,特别是在使用此函数的部分中(如上所示)。我遇到的具体错误消息是 'NoneType' 对象没有属性 'write'。 我目前无法遇到任何真正的解决方案,但如果我使用命令

pyinstaller --onedir main.py
(不带“-w”)创建exe文件,我将不会遇到这个问题。出于我的目的,我无法显示终端,所以我需要“窗口模式”。

提前,对于任何不当的措辞或解释,我深表歉意。我是西班牙语使用者,也是新在这里发帖的人。据我所知,这里是禁止使用GPT之类的模型来写的,所以暂时写不出来。 谢谢!

python tensorflow pyinstaller nonetype customtkinter
1个回答
0
投票

我通过将预测函数的“详细”参数设置为 0 解决了这个问题(例如,neural_model.predict(X_test, verbose=0))

问题是,我认为,张量流预测函数的详细输出默认情况下会尝试写入 sys.stdout,正如 Thomas Kluyver 所提到的:

如果您使用 GUI 基础冻结它,因此运行它时没有命令提示符,那么您根本不应该写入 sys.stdout 或 sys.stderr。它们用于命令提示符,因此如果您没有命令提示符,它们将无法工作。

来源:Python 3 cx_freeze Win34GUI问题

所以在这种情况下是类似的,因为在没有控制台的程序执行期间,标准输出实际上是 NoneType 。

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