Cx_freeze ImportError no module named scipy

14,711

Solution 1

I had exactly the same issue. Found the solution here: https://bitbucket.org/anthony_tuininga/cx_freeze/issues/43/import-errors-when-using-cx_freeze-with

Find the hooks.py file in cx_freeze folder. Change line 548 from finder.IncludePackage("scipy.lib") to finder.IncludePackage("scipy._lib").

Leave the "scipy" entry in packages and delete 'C:\Python34\Lib\site-packages\scipy' in include_files.

Solution 2

For all the Scipy related issues gets resolved if you include them in the script. It worked for me. Please refer my working script (Note: this script doesnot have any UI library like tkinter)

This scripts fetches the data from config file and returns the addition two number which is get written in the file in the working directory.

FolderStructure

enter image description here

setup.py

import sys
import cx_Freeze
from cx_Freeze import setup, Executable
from scipy.sparse.csgraph import _validation
import scipy
import matplotlib

'''Include the package for which you are getting error'''
packages = ['matplotlib','scipy']
executables = [cx_Freeze.Executable('main.py', base='Win32GUI')]

'''include the file of the package from python/anaconda installation '''
include_files = ['C:\\ProgramData\\Continuum\\Anaconda\\Lib\\site-packages\\scipy']

cx_Freeze.setup(
    name = 'Test1',
    options = {'build_exe': {'packages':packages,
        'include_files':include_files}},
    version = '0.1',
    description = 'Extraction of data',
    executables = executables
    )

main.py

import os, numpy as np
import configparser
from helper_scripts.help1 import Class_A

path = os.path.dirname(os.path.abspath('__file__')) + '\\'
conf = configparser.ConfigParser()
conf.read(path + 'config.ini')

a = eval(conf.get('inputs','input_1'))
b = eval(conf.get('inputs','input_2'))

obj = Class_A()

res = obj.getData(a,b)

if not os.path.exists(path + 'Result.txt'):
    with open(path + 'Result.txt', 'w', encoding ='utf-8') as f:
        f.write(f'result is : {str(res)}\n')

else:
    with open(path + 'Result.txt', 'a', encoding ='utf-8') as f:
        f.write(f'result is : {str(res)}\n')

Command to generate the exe file

''' make sure  to run the below command from working directory where the setup.py file is present.'''

python setup.py build

The build folder gets created with main.exe file all the required binaries files.

Note: Place the config.ini file in the exe folder so that exe can access the config file and produce the output.

enter image description here

Share:
14,711
Jonnyishman
Author by

Jonnyishman

Updated on July 05, 2022

Comments

  • Jonnyishman
    Jonnyishman almost 2 years

    Good day all,

    I am having trouble using cx_Freeze on a code I am working on converting to a .exe.

    When I run cx_Freeze I get the following ImportError that there no no module named scipy

    running install
    running build
    running build_exe
    Traceback (most recent call last):
      File "setup.py", line 25, in <module>
        executables = executables
      File "C:\Python34\lib\site-packages\cx_Freeze\dist.py", line 362, in setup
        distutils.core.setup(**attrs)
      File "C:\Python34\lib\distutils\core.py", line 148, in setup
        dist.run_commands()
      File "C:\Python34\lib\distutils\dist.py", line 955, in run_commands
        self.run_command(cmd)
      File "C:\Python34\lib\distutils\dist.py", line 974, in run_command
        cmd_obj.run()
      File "C:\Python34\lib\distutils\command\install.py", line 539, in run
        self.run_command('build')
      File "C:\Python34\lib\distutils\cmd.py", line 313, in run_command
        self.distribution.run_command(command)
      File "C:\Python34\lib\distutils\dist.py", line 974, in run_command
        cmd_obj.run()
      File "C:\Python34\lib\distutils\command\build.py", line 126, in run
        self.run_command(cmd_name)
      File "C:\Python34\lib\distutils\cmd.py", line 313, in run_command
        self.distribution.run_command(command)
      File "C:\Python34\lib\distutils\dist.py", line 974, in run_command
        cmd_obj.run()
      File "C:\Python34\lib\site-packages\cx_Freeze\dist.py", line 232, in run
        freezer.Freeze()
      File "C:\Python34\lib\site-packages\cx_Freeze\freezer.py", line 619, in Freeze
        self.finder = self._GetModuleFinder()
      File "C:\Python34\lib\site-packages\cx_Freeze\freezer.py", line 378, in _GetModuleFinder
        finder.IncludePackage(name)
      File "C:\Python34\lib\site-packages\cx_Freeze\finder.py", line 686, in IncludePackage
        module = self._ImportModule(name, deferredImports)
      File "C:\Python34\lib\site-packages\cx_Freeze\finder.py", line 386, in _ImportModule
        raise ImportError("No module named %r" % name)
    ImportError: No module named 'scipy'
    

    I can confirm that I have Scipy 0.16 installed on my system which works when I import it into other python code. I am currently running python 3.4 on Windows. The following is my setup.py file for cx_Freeze.

    import cx_Freeze
    import sys
    import matplotlib
    
    base = None
    
    if sys.platform == 'win32':
        base = 'Win32GUI'
    
    executables = [cx_Freeze.Executable('fractureGUI.py', base=base, icon='star_square.ico')]
    
    packages = ['tkinter','matplotlib','scipy']
    
    include_files = ['star_square.ico', 'C:\\Python34\\Lib\\site-packages\\scipy']
    
    cx_Freeze.setup(
        name = 'FracturePositionMonteCarlo',
        options = {'build_exe': {'packages':packages,
            'include_files':include_files}},
        version = '0.01',
        description = 'Fracture Depth Monte Carlo',
        executables = executables
        )
    

    The following is the import section of my main script, fractureGUI.py.

    import scipy
    from random import random
    
    import matplotlib
    import matplotlib.pyplot as plt
    import matplotlib.mlab as mlab
    matplotlib.use('TkAgg')
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
    from matplotlib import style
    style.use('ggplot')
    
    import tkinter as tk
    from tkinter import ttk, filedialog
    
    import sys
    import json
    

    If anybody has any ideas why cx_Freeze is unable to find scipy please do let me know. I tried to add the filepath to scipy under include_files but it made no difference.

    Kind regards,

    Jonnyishman