При использовании cx_Freeze и tkinter я получаю: "Ошибка загрузки DLL: указанный модуль не найден". (Python 3.5.3)
При использовании cx_Freeze и Tkinter мне выдается сообщение:
File "C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 35, in <module>
import _tkinter # If this fails your Python may not be configured for Tk
ImportError: DLL load failed: The specified module could not be found.
Некоторые вещи на заметку:
- Я хочу использовать Python 3+ (в настоящее время используется 3.5.3, 32-разрядная версия). На самом деле не волнует конкретная версия, что бы ни работало.
- В моем проекте есть несколько файлов, которые мне нужно скомпилировать. Насколько я могу судить, это оставляет меня с cx_Freeze или Nuitka. У Нуйтки были свои проблемы.
- Я использую 64-разрядную версию Windows 10 Home Edition
Вот мой текущий setup.py:
from cx_Freeze import setup, Executable
import sys
build_exe_options = {"packages": ["files", "tools"]}
base = None
if sys.platform == "win32":
base = "Win32GUI"
setup(name="Name",
version="1.0",
description="Description",
options={"build_exe": build_exe_options},
executables=[Executable("main.py", base=base)],
package_dir={'': ''},
)
Я перепробовал много решений со всех уголков интернета. В том числе, но не ограничивается:
- Несколько версий Python (и соответствующие версии cx_Freeze/Tkinter)
- И 32-битные, и 64-битные версии
- Замена Tkinter на easygui (очевидно, что для работы easygui нужен Tkinter)
- Проверка переменных PATH
- Перезагрузка компьютера (не знаю, чего я ожидал)
- Удаление других версий Python и восстановление правильной версии
Поместив следующее в мой файл bat компиляции (Определенно правильные пути):
set TCL_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\tcl\tcl8.6 set TK_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\tcl\tk8.6
Размещение следующего в моем setup.py:
options={"build_exe": {"includes": ["tkinter"]}}
- Вместе с:
include_files = [r"C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\DLLs\tcl86t.dll",\
r"C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\DLLs\tk86t.dll"]
(И да, так или иначе они были включены в setup())
Спасибо за любую помощь, это очень ценится. И да, я рассмотрел практически все решения этой проблемы на этом сайте. Надеясь, что кто-то может помочь мне найти еще одно решение, так как моя проблема, кажется, остается постоянной.
2 ответа
Нашел решение!
Мне пришлось скопировать файлы tk86t.dll и tcl86t.dll из папки DLL моего каталога python в папку сборки с файлом main.py, который я пытался скомпилировать.
Это в сочетании с наличием
set TCL_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35\tcl\tcl8.6
set TK_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35\tcl\tk8.6
в верхней части моего compile.bat, и в том числе"include_files": ["tcl86t.dll", "tk86t.dll"]
в моих build_exe_options в setup.py, похоже, добился цели.
Вот мой текущий setup.py:
from cx_Freeze import setup, Executable
import sys
build_exe_options = {"packages": ["files", "tools"], "include_files": ["tcl86t.dll", "tk86t.dll"]}
base = None
if sys.platform == "win32":
base = "Win32GUI"
setup(name="Name",
version="1.0",
description="Description",
options={"build_exe": build_exe_options},
executables=[Executable("main.py", base=base)],
package_dir={'': ''},
)
А вот мой compile.bat (обновлен, чтобы показать все шаги):
@echo off
set TCL_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\tcl\tcl8.6
set TK_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\tcl\tk8.6
RD /S /Q "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin"
mkdir "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin"
xcopy /s "C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\DLLs\tcl86t.dll" "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin\tcl86t.dll"
xcopy /s "C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\DLLs\tk86t.dll" "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin\tk86t.dll"
cd "C:\Users\VergilTheHuragok\Desktop\PythonProject\"
cxfreeze main.py --target-dir "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin" --target-name "launch.exe"
pause
Я нашел это решение здесь.
После исправления этих проблем cx_freeze
все еще не мог импортировать зависимости панд (а именно numpy
). Чтобы исправить это, я буквально скопировал и вставил целые папки в каталог.py
файл, который я пытался скомпилировать. Исполняемый файл должен находиться в том же каталоге (поэтому он не обязательно является автономным), но он работает сpandas
а также numpy
.
Чтобы решить эту проблему, просто скопируйте файлы 1.tcl86t.dll 2.tk86t.dll по этому пути C:\Users\h280126\AppData\Local\Programs\Python\Python36-32\DLLs и поместите их в наш.exe путь C:\Users\h280126\PycharmProjects\my_tool\build\exe.win32-3.6 работает нормально:)