我编写了一个脚本来使用 python/tkinter 和速度测试库 (speedtest/speedtest-cli) 执行许多宽带速度测试。当作为普通 python 脚本运行时,该程序按预期工作。我可以使用 cx_freeze 创建一个 exe 文件,它会正常创建所有内容。当我运行 exe 文件时,我得到以下回溯...
Traceback (most recent call last):
File
"c:\@python\@w4itdev\lib\site-packages\speedtest.py",
line 156, in <module>
import_builtin___
ModuleNotFoundError: No module named '__builtin__
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File
"C:\@python\@w4itdev\Lib\site-packages\cx_Freeze\initscript s_startup__.py", line 141, in run module_init.run(name + "__main__")
File
"C:\@python\@w4itdev\Lib\site-packages\cx_Freeze\initscript
s\console.py", line 25, in run
exec(code, main_globals) File "st.py", line 2, in <module>
File "c:\@python\@w4itdev\lib\site-packages\speedtest.py", line 179, in <module>
_py3_utf8_stdout= _Py3Utf8Output(sys.stdout)
File "c:\@python\@w4itdev\lib\site-packages\speedtest.py", line 166, in __init__
buf FilelO(f.fileno), 'w')
AttributeError: 'NoneType' object has no attribute 'fileno'
我已经找到了一个更简单的 python 脚本,它可以完成类似的工作来测试我的代码是否犯了错误。这给出了相同的结果。为了简单起见,我包含了简单的脚本,而不是我原来的脚本。
from tkinter import *
from speedtest import Speedtest
def update_text():
speed_test = Speedtest()
download = speed_test.download()
upload = speed_test.upload()
download_speed = round(download / (10**6), 2)
upload_speed = round(upload / (10**6), 2)
down_label.config(text= "Download Speed - " + str(download_speed) + "Mbps")
up_label.config(text= "Upload Speed - " + str(upload_speed) + "Mbps")
root = Tk()
root.title("Internet Speed Tracker")
root.geometry('300x300')
button = Button(root, text="Get Speed", width=30, command=update_text)
button.pack()
down_label = Label(root, text="")
down_label.pack()
up_label = Label(root, text="")
up_label.pack()
root.mainloop()
虽然我不是专家,但它似乎是 tkinter/speedtest/cx_freeze 和最终 stdout 的组合。
顺便说一句...chatgpt 一直在兜圈子试图解决这个问题。
Speedtest 库使用 builtin 模块,该模块在 Python 2 中可用,但在 Python 3 中不可用。cx_Freeze 尝试在 Python 3 环境中运行脚本,这会导致错误。
尝试使用 pyinstaller 或 py2exe 创建可执行文件,而不是 cx_Freeze。