7

Im trying to create a basic exe using cx_Freeze. It works for .py programs that don't have numpy but I can't get one made correctly with numpy.

*Any ideas on how to fix this? is there something i need to include in my setup.py?

When I go to run the exe it says:

           c:\Python32\Scripts\dist>Assignment4_5.exe
           Traceback (most recent call last):
     File "C:\Python32\lib\site-packages\cx_Freeze\initscripts\Console3.py", line 2
     7, in <module>
     exec(code, m.__dict__)
     File "c:\Python32\Assignment4_5.py", line 6, in <module>
     import numpy as np
     File "C:\Python32\lib\site-packages\numpy\__init__.py", line 137, in <module>
     from . import add_newdocs
     File "C:\Python32\lib\site-packages\numpy\add_newdocs.py", line 9, in <module>

     from numpy.lib import add_newdoc
     File "C:\Python32\lib\site-packages\numpy\lib\__init__.py", line 17, in <modul
     e>
    from .npyio import *
    File "C:\Python32\lib\site-packages\numpy\lib\npyio.py", line 6, in <module>
    from . import format
    ImportError: cannot import name format

   c:\Python32\Scripts\dist>

Setup.py:

   from cx_Freeze import setup, Executable

   includeDependencies = []

   setup(
        name = "Assignment4_5PythonExe",
        version = "0.1",
        description = "Sort Methods",
        executables = [Executable("Assignment4_5.py")]
        )
TMan
  • 4,044
  • 18
  • 63
  • 117
  • 1
    Try pyinstaller instead. It will handle libraries like numpy, matplotlib, etc with far less headache, i.m.o. – Joe Kington Apr 04 '12 at 12:54
  • 2
    @JoeKington: But PyInstaller won't work with `c:\Python32`... @TMan: it looks like it's failing to copy the module `numpy.lib.format`. I'll look at why that is. – Thomas K Apr 04 '12 at 17:58
  • @ThomasK - Good point. I missed that he was using python3. – Joe Kington Apr 04 '12 at 18:13
  • I wish I had python 3, then py2exe would solve my problem... Fortunately stuck with 2 for my problem... – ntg Aug 22 '16 at 10:02

3 Answers3

5

This is a bug in cx_Freeze - it doesn't automatically detect that it should copy the module numpy.lib.format. It's already fixed in the development version, so if you're in a position to try that, it should work.

Otherwise, you'll need to specify that numpy.lib.format needs to be included in your setup.py. The line will look something like this:

options = {"build_exe": {"packages": ["numpy.lib.format"]}},

See also the documentation.

Thomas K
  • 39,200
  • 7
  • 84
  • 86
  • Hey, how would I edit the cxfreeze main.py with this addition? wouldn't that enable the standard cxfreeze script located in Python36/Scripts to convert numpy scripts also? – Artur Müller Romanov Jul 20 '18 at 14:18
5

Numpy seems to be a little confusing to cx_Freeze so you need to declare it explicitly. As referenced in the docs

Here is your solution:

   from cx_Freeze import setup, Executable

   build_exe_options = {"packages": ["numpy"]}

   setup(
        name = "Assignment4_5PythonExe",
        version = "0.1",
        description = "Sort Methods",
        options = {"build_exe": build_exe_options},
        executables = [Executable("Assignment4_5.py")]
        )
blackmore5
  • 73
  • 1
  • 6
  • 1
    I can confirm this works @blackmore5. Note that my build options reads: build_exe_options = {"include_files": ["tcl86t.dll", "tk86t.dll"], "packages": ["numpy"]} – Lionel Yu Sep 18 '18 at 18:53
0

I recently encountered this issue using cx_freeze 6.1 and Python 3.5.4. In order to solve my runtime issues, I had to add the numpy lib path to the system paths at runtime. Here is the relevant code snippet if it can help anyone:

if __name__ == '__main__':
# The frozen app needs the numpy path added to it's file.
try:
    this_file = __file__
except NameError:
    this_file = sys.argv[0]
    sys.path.insert(0, str(Path(this_file).absolute().parent / "lib" / "numpy"))
ExaltedBagel
  • 582
  • 5
  • 14