Reputation: 69
I'm using python 3.7 and cx_Freeze 5.1.1 , I'm, trying to convert my python script into an executable but I am getting thrown a missing module error and I am stumped.
I have tried putting the modules in the package and includes of the setup script but nothing is changing.
import sys
from cx_Freeze import setup, Executable
# Dependencies are automatically detected, but it might need fine tuning.
# build_exe_options = {"packages": ["os", "win32api", "win32con", "pywintypes", "easyguy", "ntsecuritycon"
# , "win32security", "errno", "shutil", "ctypes"], "excludes": ["tkinter"],
# "includes" = ['easy_gui']}
build_exe_options = {'packages': ['sys', "os", "win32api", "win32con",
"pywintypes", "easygui", "ntsecuritycon",
"errno", "shutil", "ctypes", "win32security",
"errno", "shutil", "ctypes"],
'excludes': ['tkinter'],
'includes': ["os", "win32api", "win32con", "pywintypes",
"easygui", "ntsecuritycon",
"errno", "shutil", "ctypes", "win32security",
"errno", "shutil", "ctypes"]}
# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
if sys.platform == "win32":
base = "Win32GUI"
setup(name="Automated Installer", # this will set the name of the created executable to "Automated Installer.exe"
version="0.1",
description="My GUI application!",
options={"build_exe": build_exe_options},
executables=[Executable("Automated Installer.py", base=base)]) # this tells cx_Freeze to freeze the script "Automated Installer.py"
I expect a executable to be created, instead I am thrown this error\
ImportError: No module named 'win32api'
EDIT 2: Reflecting Steps taken by the answer posted below.
I upgraded back to Python 3.7 and I applied the fix to freezer.py as recommended. I took the exact same easygui script written and the same setup.py script also written below. The executable builds, but does not run. I am thrown an error shown below. I am able to run the example easygui script just fine, so that leads me to believe that easygui is installed correctly.
I'm not too sure what you mean by the full stack trace but here is some notable output from the command prompt that I received
Missing modules:
? __main__ imported from bdb, pdb
? _frozen_importlib imported from importlib, importlib.abc
? _frozen_importlib_external imported from importlib, importlib._bootstrap,
importlib.abc
? _posixsubprocess imported from subprocess
? _winreg imported from platform
? easygui imported from hello world__main__
? grp imported from shutil, tarfile
? java.lang imported from platform
? org.python.core imported from copy, pickle
? os.path imported from os, pkgutil, py_compile, tracemalloc, unittest,
unittest.util
? posix imported from os
? pwd imported from http.server, posixpath, shutil, tarfile, webbrowser
? termios imported from tty
? vms_lib imported from platform
This is not necessarily a problem - the modules may not be needed on this
platform.
running build
running build_exe
copying C:\Users\Billy\AppData\Local\Programs\Python\Python37\lib\site-
packages\cx_Freeze\bases\Win32GUI.exe -> build\exe.win-amd64-3.7\hello
world.exe
copying
C:\Users\Billy\AppData\Local\Programs\Python\Python37\python37.dll ->
build\exe.win-amd64-3.7\python37.dll
copying
C:\Users\Billy\AppData\Local\Programs\Python\Python37\VCRUNTIME140.dll ->
build\exe.win-amd64-3.7\VCRUNTIME140.dll
copying C:\Program Files\TortoiseGit\bin\api-ms-win-crt-runtime-l1-1-0.dll -
>
build\exe.win-amd64-3.7\api-ms-win-crt-runtime-l1-1-0.dll
copying C:\Program Files\TortoiseGit\bin\api-ms-win-crt-stdio-l1-1-0.dll ->
build\exe.win-amd64-3.7\api-ms-win-crt-stdio-l1-1-0.dll
copying C:\Program Files\TortoiseGit\bin\api-ms-win-crt-math-l1-1-0.dll ->
build\exe.win-amd64-3.7\api-ms-win-crt-math-l1-1-0.dll
copying C:\Program Files\TortoiseGit\bin\api-ms-win-crt-locale-l1-1-0.dll ->
build\exe.win-amd64-3.7\api-ms-win-crt-locale-l1-1-0.dll
copying C:\Program Files\TortoiseGit\bin\api-ms-win-crt-heap-l1-1-0.dll ->
build\exe.win-amd64-3.7\api-ms-win-crt-heap-l1-1-0.dll
*** WARNING *** unable to create version resource
install pywin32 extensions first
writing zip file build\exe.win-amd64-3.7\lib\library.zip
Upvotes: 1
Views: 2593
Reputation: 2461
cx_Freeze
does not yet support Python 3.7, it has a bug. A bugfix exists but has not yet been released, however you can apply it manually, see What could be the reason for fatal python error:initfsencoding:unable to load the file system codec? and Cx_freeze crashing Python3.7.0. Or you can rollback to Python 3.6 if this is an option for you.EDIT:
Check that easygui
is correctly installed. You should for example be able to run the following hello.py
example script from the easygui
documentation:
from easygui import *
import sys
# A nice welcome message
ret_val = msgbox("Hello, World!")
if ret_val is None: # User closed msgbox
sys.exit(0)
msg = "What is your favorite flavor?\nOr Press <cancel> to exit."
title = "Ice Cream Survey"
choices = ["Vanilla", "Chocolate", "Strawberry", "Rocky Road"]
while 1:
choice = choicebox(msg, title, choices)
if choice is None:
sys.exit(0)
msgbox("You chose: {}".format(choice), "Survey Result")
Try to freeze this example script. easygui
depends on tkinter
, which requires some additional tuning to be frozen with cx_Freeze
5.1.1, see tkinter program compiles with cx_Freeze but program will not launch. You should be able to freeze the example using the following setup script:
from cx_Freeze import setup, Executable
import os
import sys
PYTHON_INSTALL_DIR = os.path.dirname(sys.executable)
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_exe_options = {'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'))]}
# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
if sys.platform == 'win32':
base = 'Win32GUI'
setup(name='hello',
version='0.1',
description='Sample cx_Freeze EasyGUI script',
executables=[Executable('hello.py', base=base)],
options={'build_exe': build_exe_options})
Upvotes: 1