当我使用cx_Freeze
时,我在构建我的pygame程序时得到了一个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")],
)
答案 0 :(得分:65)
您可以通过手动设置环境变量来解决此错误:
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 mailinglist it was mentioned:
我已经调查过它,不,它不只是一个简单的重新编译 - 或者它本来就已经完成了! : - )
它正在进行中,看起来需要花费一些力气。一些 用于处理包内扩展模块之类的代码 正在倒下 - 这可以通过删除代码和更好地解决 强制包在zip文件之外(需要另一个pull请求 被吸收)。我下周和下周应该有一些时间 进一步研究这个问题。所以一切顺利,我应该推出 一年前的新版cx_Freeze。
但也许你有更多的运气...... Here's the bug report。
答案 1 :(得分:33)
除了使用特定于安装的绝对路径(如C:\\LOCAL_TO_PYTHON\\...
)设置环境变量,您还可以使用Python标准包的__file__
属性动态导出必要的路径,如os
:
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')
在此修复之后,将创建可执行文件,但您可能会收到" DLL未找到错误"当你尝试执行它时 - 至少在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,
# ...
)
答案 2 :(得分:14)
只需在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
这对我来说很好。
答案 3 :(得分:5)
如果你在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'
只需在LOCAL_TO_PYTHON
中创建C:\
目录,然后在其中创建Python35-32
目录。现在将tcl
目录从现有Python36
目录(C:\
)复制到Python35-32
。
然后它工作正常。
答案 4 :(得分:0)
D. L. Müller's answer。在这些版本的cx_Freeze中,程序包被冻结到构建目录的子目录lib
中。 TCL和TK DLL也需要移动到那里。这可以通过将元组(source, destination)
传递到include_files
列表选项的相应条目(请参见cx_Freeze documentation)来实现。
setup.py
脚本总共需要进行如下修改:
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')
# ...
options = {
'build_exe': {
'include_files':[
(os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), os.path.join('lib', 'tk86t.dll'))
(os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), os.path.join('lib', 'tcl86t.dll'))
],
},
}
# ...
setup(options = options,
# ...
)
答案 5 :(得分:0)
最初的KeyError问题:
这对Windows 7上的python 3.7很有帮助:
from cx_Freeze import setup, Executable
import os
import sys
where = os.path.dirname(sys.executable)
os.environ['TCL_LIBRARY'] = where+"\\tcl\\tcl8.6"
os.environ['TK_LIBRARY'] = where+"\\tcl\\tk8.6"
build_exe_options = {"include_files": [where+"\\DLLs\\tcl86t.dll", where+"\\DLLs\\tk86t.dll"]}
setup(
name = "SudoCool",
version = "0.1",
description = "Programme de SUDOKU",
options={"build_exe": build_exe_options},
executables = [Executable("sudoku.py")]
)