Adding "matplotlib" to packages in cx_Freeze doesn't work - python-3.x

I am programming on Win 7 in Spyder/Anaconda. And I am having trouble converting my py into an exe. For background, my program .py has a few csv files it takes data from, asks the user for 4 integers, and generates a plot in matplotlib. It imports the packages below.
I was able to execute something like this (How can I convert a .py to .exe for Python?) but my situation isn't working when I start to use my code.
If I include "matplotlib" into the packages list, I get "KeyError: 'TCL_Library". What is this error and how do I fix it? Adding "os" works for reference.
In my program py, I use: import os, from os import listdir, import pylab, import matplotlib.pyplot as plt, import numpy as np, import matplotlib, import random. Do I leave these in my program py or move them to setup and how do I include the "from xxx" items in the packages array?
import os
from cx_Freeze import setup, Executable
base = None
executables = [Executable("try1.py", base=base)]
cwd = os.getcwd()
f_3_to_3=cwd+'\\' + '3_to_3.csv'
packages = ["idna", "matplotlib"]
options = {
'build_exe': {
"include_files": (f_3_to_3),
'packages':packages,
},
}
setup(
name = "FirstBuild",
options = options,
version = "0",
description = 'This is cool',
executables = executables
)

Using this for my setup file worked. Note, I had to fix directory for tk and tcl along with reinstalling them
import os
from cx_Freeze import setup, Executable
import sys
base = None
os.environ['TCL_LIBRARY'] = "C:\\ProgramData\\Anaconda3\\Library\\lib\\tcl8.6"
os.environ['TK_LIBRARY'] = "C:\\ProgramData\\Anaconda3\\Library\\lib\\tk8.6"
executables = [Executable("MyPyFile.py", base=base)]
packages = ["idna", "os", "numpy", "numpy.core._methods", "matplotlib", "random"]
options = {
'build_exe': {
"includes": ["numpy.core._methods", "numpy", "tkinter"],
"include_files": [r'C:\ProgramData\Anaconda3\Library\plugins\platforms'],
'packages':packages,
},
}
setup(
name = "FirstBuild",
options = options,
version = "0",
description = 'This is cool',
executables = executables
)

Related

pxd relative cimport works for language_level 2 but not for 3

!Everything works with language_level=2, but does not with language_level=3
I have to wrap c-library with Cython and I also want to copy the structure of the library for better understanding. So I'd like to create separate folder with pxd files.
The project structure is following:
setup.py:
from setuptools import setup, Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext
from pathlib import Path
setup_file_directory = Path(__file__).resolve().parent
NAME = 'example'
SRC_DIR = "lib"
PACKAGES = [SRC_DIR]
ext = Extension(name=SRC_DIR + ".wrapper.some_code",
sources=[SRC_DIR + "/wrapper/some_code.pyx"]
)
EXTENSIONS = [ext]
if __name__ == "__main__":
setup(
packages=PACKAGES,
zip_safe=False,
name=NAME,
cmdclass={"build_ext": build_ext},
ext_modules=cythonize(EXTENSIONS, language_level=3),
)
some_code.pyx:
from pxd_include.inc_file cimport *
cdef custom_int return_int(custom_int input_int):
print(input_int)
inc_file.pxd:
ctypedef int custom_int
with language_level=2 in setup.py everything works and compiles. If I switch it to 3 I get an Error:
It is caused by unability to import pxd file with language_level=3. How to fix that?
To make relative path work with language_level=3 I had to import pxd in somecode.pyx in this way:
from .pxd_include.inc_file cimport *
or
from lib.wrapper.pxd_include.inc_file cimport *
Last notation is compatible with language_level=2

Tkinter not found after cx_Freeze process

I wrote the folowwing at the top of my script:
try:
from Tkinter import *
from Tkinter import messagebox
except ModuleNotFoundError:
from tkinter import *
from tkinter import messagebox
else:
print("tkinter error")
input()
sys.exit()
Running my script as .py or .pyw works without problems. But when I make and .exe out of it with cx_Freeze, the exe throws the error:
And why is that? how to solve this?
Thanks...
EDIT:
Also my setup.py:
import sys
import os
from cx_Freeze import setup, Executable
os.environ['TCL_LIBRARY'] = r"C:\Python\Python36-32\tcl\tcl8.6"
os.environ['TK_LIBRARY'] = r"C:\Python\Python36-32\tcl\tk8.6"
base = None
executables = [Executable("toolbar.py", base=base)]
packages = []
options = {
'build_exe': {
'packages':packages,
},
}
setup(
name = "Desktop Toolbar",
options = options,
version = "1.0",
description = " ",
executables = executables
)

Cannot fix pywintypes.error: (2, 'BeginUpdateResource', 'The system cannot find the file specified.')

I am trying to build an .exe file of my Python application. I have tried various ways to create a setup file from both Github and Stackoverflow and I keep getting this same error:
pywintypes.error: (2, 'BeginUpdateResource', 'The system cannot find the file specified.').
I am using Python 3.6.1, and cx_Freeze to build the application.
Here are the different setup files I have tried:
Attempt 1:
import os.path
from cx_Freeze import setup, Executable
os.environ['TCL_LIBRARY'] = r'C:\Users\RedCode\AppData\Local\Programs\Python\Python36-32\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Users\RedCode\AppData\Local\Programs\Python\Python36-32\tcl\tk8.6'
executables = [Executable("myprogram.py", base="Win32GUI")]
options = {
'build_exe': {
'include_files': [
os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'),
]
},
}
setup(
name="Standalone.exe",
options=options,
version="0.1",
description='Simple tkinter application',
executables=executables, requires=['cx_Freeze', 'cx_Freeze']
)
Attempt 2:
from cx_Freeze import setup, Executable
import sys
import os
productName = "My Program"
if 'bdist_msi' in sys.argv:
sys.argv += ['--initial-target-dir', r'C:\Users\RedCode\PycharmProjects\Standalone' + productName]
sys.argv += ['--install-script', 'myprogram.py']
os.environ['TCL_LIBRARY'] = r'C:\Users\RedCode\AppData\Local\Programs\Python\Python36-32\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Users\RedCode\AppData\Local\Programs\Python\Python36-32\tcl\tk8.6'
exe = Executable(
script="myprogram.py",
base="Win32GUI",
targetName="Product.exe"
)
setup(
name="Standalone.exe",
version="1.0",
author="Me",
description="Copyright 2012",
executables=[exe],
scripts=[
'myprogram.py'
]
)
Attempt 3:
import sys
import os
from cx_Freeze import setup, Executable
build_exe_options = {"packages": ["os"], "includes": ["tkinter"]}
def s_SourceFile():
if (sys.argv[0] == ''):
return __file__
else:
return sys.argv[0]
os.environ['TCL_LIBRARY'] = r'C:\Users\stefano.demattia\AppData\Local\Programs\Python\Python36-32\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Users\stefano.demattia\AppData\Local\Programs\Python\Python36-32\tcl\tk8.6'
setup(name="Standalone",
version="0.1",
description="My GUI application!",
options={"build_exe": build_exe_options},
executables=[Executable("myprogram.py", base="Win32GUI", targetName="Standalone.exe")])
Attempt 4:
application_title = "Car Database"
main_python_file = "cardb.py"
import sys
from cx_Freeze import setup, Executable
base = None
if sys.platform == "win32":
base = "Win32GUI"
setup(
name = "myprogram.py",
version = "0.1",
description = "Simple embedded database application",
executables = [Executable("myprogram.py", base = base)])
I have also tried pyinstaller but it keeps giving me a tuple out of range error no matter what I do, and I tried bbfreeze which I can't even get to install. I have checked my files and everything is there, so I do not see how it can still tell me a specified file is not found.
What else can I do or how can I edit the above attempts so that the application actually builds properly? Is there even a way to determine which file is missing?
Remove the version, I got the same error, looked at the code and noticed it was referencing versioning in the source, so thought I'd try it, and it fixed it for me.
I know the poster probably no longer needs this, but posting it for others that come across this in the future since I didn't see the answer anywhere else.
cx_Freeze.setup(
name="SampleName",
options={"build_exe": {"packages": ["tkinter", "os"],
"include_files": ['tcl86t.dll', 'tk86t.dll', 'closenew.png', 'sujata.png', 'config.py', 'ui_attributes.py']}},
version="0.01", # Remove this line
description="Tkinter Application",
executables=executables
)
I have removed the version and it worked.
cx_Freeze.setup(
name="SampleName",
options={"build_exe": {"packages": ["tkinter", "os"],
"include_files": ['tcl86t.dll', 'tk86t.dll', 'closenew.png', 'sujata.png', 'config.py', 'ui_attributes.py']}},
description="Tkinter Application",
executables=executables
)

cx_freeze gives input and file errors

I've seen similar problems on different forums, but none applies to this.
I have two files, one 'main.py' and the main program 'xlsKonverter.py' which I want to use cx_freeze to compile to an .exe file. When building the .exe I get this error message:
pywintypes.error: (110, 'EndUpdateResource', 'The system cannot open the device or file specified.')
And when trying to run the (somewhat finished) build, this Exception pops up:
I've tested all of my code, so the error is not there. It must be somewhere within the setup file. Am I wrong? And what would be a good fix?
'setup.py'
This is my cx_freeze setup
import sys
from cx_Freeze import setup, Executable
build_exe_options = {"packages": ["os"], "excludes": ["tkinter"]}
packages = ['xlrd', 'glob', 'sys']
includes = ['xlsKonverter']
includefiles = []
eggsacutibull = Executable(
script = "main.py",
base = 'Console',
initScript = None,
targetName = "main.py",
compress = True,
copyDependentFiles = True,
appendScriptToExe = False,
appendScriptToLibrary = False,
icon = None
)
setup( name = "Table Converter",
version = "0.3",
author = "Jørgen Sirhaug",
description = "Makes a .csv file from designated Wire List.",
options = {"build_exe": build_exe_options},
executables = [eggsacutibull]
)
'main.py'
, my main function
import xlsKonverter as xk
import os.path
import sys
def main():
fileList = xk.getAllFileURLsInDirectory("C:\\Users\\Jørgen\\Dropbox\\Aker\\Wire Lists\\")
if len(fileList) < 1:
print("ERROR! No files in directory!\nDoes the specified folder excist?")
else:
print('')
for i in range(len(fileList)):
try:
sheet = xk.getWorksheet(fileList[i])
tagCols = xk.automaticFirstRow(sheet)
pairedList = xk.pairCells(sheet, tagCols)
csvString = xk.makecsv(pairedList)#, tagCols)
xk.writeToFile(csvString, i)
except:
print("ERROR!\n" + fileList[i] + '\nThis file does not excist!')
main()
and the imports from 'xlsKonverter.py'
import xlrd
import glob
import sys
Try putting an encoding declaration in your main.py file. That's a comment that looks like this:
# encoding: cp1252
You might have to change the last bit depending on how you're saving the file. If it's created on Windows, cp1252 is normal for Western Europe. On Linux and Mac, utf8 is more common.

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

Resources