Folaht
Folaht

Reputation: 1123

How does cxFreeze include internal project modules?

Update:

I suspect this is an error in cxFreeze as I understand this should go automatically.

end update

Update:

I missed an error given by cxFreeze:

Missing modules:
? Test.MyClass imported from main__main__

end update

I'm not sure what the proper term is for modules within project unlike sys or PyQt, so I'm going with internal project modules.

I have some example code below where I recieve the error "ImportError: cannot import name MyClass." and I would love to know how to get cxFreeze to compile that 'Test.py' module.

Here's my main code:

Main.py

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
#from guiObjects.MainWindow import MainWindow
from Test import MyClass

if __name__ == "__main__":

    # Initializing the main window
    app = QApplication(sys.argv)
    widget = QMainWindow()
    #mainWindow = MainWindow(widget)
    test = MyClass()
    widget.show()

    sys.exit(app.exec_())

Test.py

class MyClass(object):
    def __init__(self):
        pass

__init.py__

'''empty'''

Setup.py

import sys
from cx_Freeze import setup, Executable

path_platforms = ( "C:\Python33\Lib\site-packages\PyQt5\plugins\platforms\qwindows.dll", "platforms\qwindows.dll" )

includes = ["re","sip","atexit","PyQt5.QtCore","PyQt5.QtGui"]
includefiles = [path_platforms]
excludes = [
    '_gtkagg', '_tkagg', 'bsddb', 'curses', 'email', 'pywin.debugger',
    'pywin.debugger.dbgcon', 'pywin.dialogs', 'tcl',
    'Tkconstants', 'Tkinter'
]
packages = ["os"]
path = []

# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {
                     "includes":      includes, 
                     "include_files": includefiles,
                     "excludes":      excludes, 
                     "packages":      packages, 
                     "path":          path
}

# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
exe = None
if sys.platform == "win32":
    exe = Executable(
      script="../Main.py",
      initScript = None,
      base="Win32GUI",
      targetDir = r"dist",
      targetName="Main.exe",
      compress = True,
      copyDependentFiles = True,
      appendScriptToExe = False,
      appendScriptToLibrary = False,
      icon = None
    )

setup(  
      name = "Main",
      version = "0.1",
      author = 'me',
      description = "My GUI application!",
      options = {"build_exe": build_exe_options},
      executables = [exe]
)

Upvotes: 0

Views: 1246

Answers (2)

Folaht
Folaht

Reputation: 1123

This problem happens when you run setup.py in a subfolder of where Main.py is located. I now placed my setup.py in the same folder as Main.py. and changed my .bat file to python ../setup.py build install.

This seems to be a bug in cx_Freeze as it works fine for Python 2.7, but not Python 3.3.

Upvotes: 1

Hendry
Hendry

Reputation: 900

Your test.py is wrong, you can't leave functions empty, try

class MyClass(object):
    def __init__(self):
        pass

and in setup.py mabye add "Test" into "includes"

includes = ["re","sip","atexit","PyQt5.QtCore","PyQt5.QtGui", "Test"]

Upvotes: 0

Related Questions