KeyError:当我使用cx_Freeze时'TCL_Library'

时间:2016-02-21 08:12:13

标签: python python-3.x cx-freeze

当我使用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")],
    )

6 个答案:

答案 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)

对于cx_Freeze版本5.1.1或5.1.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问题:

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")]
) 

现在cx_Freeze正在运行: it's working

enter image description here

enter image description here

我的应用程序正在运行: enter image description here