我在使用 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 文件的执行期间发生,特别是在使用此函数的部分中(如上所示)。我遇到的具体错误消息是
pyinstaller --onedir main.py
(不带“-w”)创建exe文件,我将不会遇到这个问题。出于我的目的,我无法显示终端,所以我需要“窗口模式”。
提前,对于任何不当的措辞或解释,我深表歉意。我是西班牙语使用者,也是新在这里发帖的人。据我所知,这里是禁止使用GPT之类的模型来写的,所以暂时写不出来。 谢谢!
我通过将预测函数的“详细”参数设置为 0 解决了这个问题(例如,neural_model.predict(X_test, verbose=0))
问题是,我认为,张量流预测函数的详细输出默认情况下会尝试写入 sys.stdout,正如 Thomas Kluyver 所提到的:
如果您使用 GUI 基础冻结它,因此运行它时没有命令提示符,那么您根本不应该写入 sys.stdout 或 sys.stderr。它们用于命令提示符,因此如果您没有命令提示符,它们将无法工作。
来源:Python 3 cx_freeze Win34GUI问题
所以在这种情况下是类似的,因为在没有控制台的程序执行期间,标准输出实际上是 NoneType 。