KeyError: "TCL_Library", когда я использую cx_Freeze

Когда я использую cx_Freeze, я получаю keyerror KeyError: 'TCL_Library' при создании моей программы pygame. Почему я получаю это и как его исправить?

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

Ответы

Ответ 1

Вы можете обойти эту ошибку, установив переменные среды вручную:

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 было упомянуто:

Я уже заглянул в него и нет, это не просто перекомпиляция - или это уже было бы сделано! :-)

Это продолжается, и похоже, что потребуется немного усилий. Некоторая часть кода, предназначенная для обработки таких вещей, как модули расширения внутри пакетов, падает, и это может быть лучше решено путем удаления этого кода и форсирования пакета за пределами zip файла (еще один запрос на перенос, который должен быть поглощен). У меня должно быть некоторое время на следующей неделе и на следующей неделе, чтобы изучить это дальше. Итак, все, что хорошо работает, я должен опубликовать новую версию cx_Freeze до конца года.

Но, возможно, вам больше повезло... Вот отчет об ошибке.

Ответ 2

Вместо того, чтобы устанавливать переменные среды с использованием конкретных абсолютных путей установки, таких как C:\\LOCAL_TO_PYTHON\\..., вы также можете динамически выводить необходимые пути с помощью атрибута __file__ стандартного пакета Python, такого как 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 не найденную ошибку" при попытке выполнить ее - по крайней мере, с Python 3.5.3 и cx_Freeze 5.0.1 в Windows 10.

При добавлении следующих параметров необходимые DLL файлы будут автоматически скопированы из каталога Python-Installation в build-output 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,
      # ...
)

Ответ 3

Просто поставьте это до установки на 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

Это сработало для меня.

Ответ 4

Если у вас возникла ошибка с 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 dir в C:\, затем создайте в нем Python35-32 dir. Теперь скопируйте tcl dir из существующего Python36 dir (в C:\) в Python35-32.

Тогда он отлично работает.

Ответ 5

Если у вас возникла ошибка с python 3.6:

копирование C:\LOCAL_TO_PYTHON\Python35-32\tcl\tcl8.6build\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 dir в C: \, затем создайте в нем Python35-32. Теперь скопируйте tcl dir из существующего каталога Python36 (в C :) в Python35-32.

Тогда он отлично работает.

** Я сделал эти шаги и создал файл.exe в каталоге сборки, но если ı попытаться щелкнуть приложение, не ждать на экране мгновенно быстро, мои коды здесь **

from tkinter import *
import socket



window=Tk()
window.geometry("400x150")
window.title("IpConfiger")
window.config(background="black")

def goster():
    x=socket.gethostbyname(socket.gethostname())
    label=Label(window,text=x,fg="green",font=("Helvetica",16))
    label.pack()
def information():
    info=Label(window,text="Bu program anlık ip değerini 
    bastırır.",fg="green",font=("Helvetica",16),bg="black")
    info.pack()


information()
tikla=Button(window,text="ip göster",command=goster)

tikla.pack()

Ответ 6

Ответ DL Müller необходимо изменить для версии cx_Freeze 5.1.1 или 5.1.0. В этих версиях cx_Freeze пакеты замораживаются в подкаталоге lib каталога build. Библиотеки TCL и TK также должны быть перемещены туда. Это может быть достигнуто путем передачи кортежа (source, destination) в соответствующую запись опции списка include_files (см. Документацию cx_Freeze).

В целом сценарий 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,
      # ...
)

Ответ 7

Начальная проблема KeyError:

KeyError

Это работает для меня с Python 3.7 на Windows 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