KeyError:'TCL_Library'当我使用cx_Freeze

当我使用cx_Freeze时,在构build我的pygame程序时,我得到了一个keyerror KeyError KeyError: 'TCL_Library' 。 为什么我得到这个,如何解决?

我的setup.py如下:

 from cx_Freeze import setup, Executable setup( name = "Snakes and Ladders", version = "0.9", author = "Adam", author_email = "Omitted", options = {"build_exe": {"packages":["pygame"], "include_files": ["main.py", "squares.py", "pictures/Base Dice.png", "pictures/Dice 1.png", "pictures/Dice 2.png", "pictures/Dice 3.png", "pictures/Dice 4.png", "pictures/Dice 5.png", "pictures/Dice 6.png"]}}, executables = [Executable("run.py")], ) 

这可能是因为你正在使用Python 3.5以及来自Christoph Gohlke的非官方版本 。

您可以通过手动设置环境variables来解决此错误:

 set TCL_LIBRARY=C:\Program Files\Python35-32\tcl\tcl8.6 set TK_LIBRARY=C:\Program Files\Python35-32\tcl\tk8.6 

你也可以在setup.py脚本中做到这一点:

 os.environ['TCL_LIBRARY'] = r'C:\Program Files\Python35-32\tcl\tcl8.6' os.environ['TK_LIBRARY'] = r'C:\Program Files\Python35-32\tcl\tk8.6' setup( [..] ) 

但是我发现实际运行程序不起作用。 在cx_freeze邮件列表上提到 :

我已经看过它,不,这不仅仅是一个简单的重新编译 – 否则它已经完成了! 🙂

它正在进行,看起来会花费一些努力。 一些用于处理包内部扩展模块之类的东西的代码正在崩溃 – 这可以通过删除代码并强制压缩文件之外的包(另一个需要吸收的拉取请求)来解决。 我应该在下个星期和下一个星期有一些时间来进一步研究。 所以所有的事情都做得好,我应该在年底之前推出一个新版本的cx_Freeze。

但也许你有更多的运气… 这是错误报告 。

您可以使用Python标准软件包的__file__属性dynamic地派生出必要的path,例如使用安装特定的绝对path(如C:\\LOCAL_TO_PYTHON\\...来设置环境variables:

 import os.path 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') 

在此修复程序之后,将会创build可执行文件,但是当您尝试执行该文件时,可能会收到“DLL未find错误” – 至less在Windows 10上使用Python 3.5.3和cx_Freeze 5.0.1。

当你添加以下选项时,必要的DLL文件将从Python安装目录自动复制到cx-Freeze的生成输出,你应该能够运行你的Tcl / Tk应用程序:

 options = { 'build_exe': { 'include_files':[ os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), ], }, } # ... setup(options = options, # ... ) 

只需在setup.py中设置即可

 import os os.environ['TCL_LIBRARY'] = "C:\\LOCAL_TO_PYTHON\\Python35-32\\tcl\\tcl8.6" os.environ['TK_LIBRARY'] = "C:\\LOCAL_TO_PYTHON\\Python35-32\\tcl\\tk8.6" 

并运行它:

 python setup.py bdist_msi 

这对我来说工作得很好。

如果你得到以下错误与python 3.6:

 copying C:\LOCAL_TO_PYTHON\Python35-32\tcl\tcl8.6 -> build\exe.win-amd64-3.6\tcl error: [Errno 2] No such file or directory: 'C:\\LOCAL_TO_PYTHON\\Python35-32\\tcl\\tcl8.6' 

只需在C:\创buildPython35-32目录,然后在其中创buildPython35-32目录。 现在从现有的Python36目录拷贝tcl目录(在C:\ )到Python35-32

然后它工作正常。