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
。
然后它工作正常。