CX_freeze 可执行文件将不起作用。 _tkinter DLL 加载失败
Posted
技术标签:
【中文标题】CX_freeze 可执行文件将不起作用。 _tkinter DLL 加载失败【英文标题】:CX_freeze executable will not work. _tkinter DLL load failed 【发布时间】:2017-10-23 01:08:07 【问题描述】:我遇到了与许多其他问题相同的问题,但还没有找到有效的解决方案。这是在 Windows 10 64 位、Python 3.6 32 位上。
我已尝试多次卸载 64 位 Python,安装文件中的各种路径和变量组合。
我确实发现来自 exe 文件的回溯指的是我的 Python 文件夹中的文件路径,而不是可执行文件所在的构建文件夹,这令人困惑。我会认为这个exe现在应该是“无辜”的python文件夹的存在?
exe文件的输出
Traceback (most recent call last):
File "C:\Program Files (x86)\Python36-32\lib\site-packages\cx_Freeze\initscripts\__startup__.py", line 14, in run
module.run()
File "C:\Program Files (x86)\Python36-32\lib\site-packages\cx_Freeze\initscripts\Console.py", line 26, in run
exec(code, m.__dict__)
File "main3.py", line 2, in <module>
File "C:\Program Files (x86)\Python36-32\lib\site-packages\appJar\__init__.py", line 2, in <module>
from appJar.appjar import gui
File "C:\Program Files (x86)\Python36-32\lib\site-packages\appJar\appjar.py", line 23, in <module>
from tkinter import *
File "C:\Program Files (x86)\Python36-32\lib\tkinter\__init__.py", line 36, in <module>
import _tkinter # If this fails your Python may not be configured for Tk
ImportError: DLL load failed: The specified module could not be found.
我的 cx_freeze 设置文件 -
from cx_Freeze import setup, Executable
import os
os.environ['TCL_LIBRARY'] = r'C:\Program Files (x86)\Python36-32\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Program Files (x86)\Python36-32\tcl\tk8.6'
build_exe_options=
"includes": [],
"packages": ["os","tkinter"],
"include_files" : [r'C:\Program Files (x86)\Python36-32\DLLs\tcl86t.dll',
r'C:\Program Files (x86)\Python36-32\DLLs\tk86t.dll']
setup(name = "main" ,
version = "0.1" ,
description = "" ,
options="build.exe":build_exe_options,
executables = [Executable("main3.py", base=None, targetName="hexml.exe")])
【问题讨论】:
来自官方的关闭原因:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及最短的代码在问题本身中重现它。一个推论是代码应该添加到问题中,而不是从外部文件柜提供。您是否可以将此信息添加到问题中,以使未来的读者受益? 【参考方案1】:我终于找到了答案。安装文件中包含 tcl86t.dll
和 tk86t.dll
文件的行由于某种原因没有完成它们的工作。一定是路径格式有问题。
有效的方法是从Python\Dlls
文件夹手动复制它们并将它们粘贴到新可执行文件所在的exe.win
文件夹中。
我随后发现了 here 一个 setup.py 脚本,它可以获取正确的路径。 V 现在很开心。
from cx_Freeze import setup, Executable
import os
import sys
PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')
options =
'build_exe':
'include_files':[
os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'),
],
,
setup(name = "main" ,
version = "0.1" ,
description = "" ,
options=options,
executables = [Executable("main3.py", base=None, targetName="hexml.exe")])
【讨论】:
这比将dll直接复制到exe位置要好得多,这是许多与此问题类似的问答中的建议。 什么鬼?在这个问题之前我已经这样做了。还是一样的错误以上是关于CX_freeze 可执行文件将不起作用。 _tkinter DLL 加载失败的主要内容,如果未能解决你的问题,请参考以下文章
cx_freeze 不允许我用 librosa Python3 制作 gui
cx Freeze executable no starting import _tkinter # 如果失败,你的 python 可能没有配置为 tk