Error al comstackr archivos ejecutables desde Python3.6 importando pandas usando cx_Freeze

Estoy tratando de crear un ejecutable de Python 3.6 usando cx_Freeze que incluye pandas y numpy. Estoy usando Python 3.6.5 y un entorno virtual creado usando virtualenvwrapper. Estoy desarrollando en Windows 10. La versión cx_Freeze es 5.1. Las versiones de pandas son 0.23.4.

Mi setup.py se ve así:

import os from cx_Freeze import setup, Executable PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__)) 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') executables = [Executable("main.py", base=base)] packages = ["idna", "os", "numpy","importlib", "pandas"] options = { 'build_exe': { 'packages':packages, 'include_files':[ os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'sqlite3.dll'), ], }, } setup( name = "MyScript", options = options, version = "0.1", description = 'Placeholder desc', executables = executables ) 

Tenga en cuenta que configuro manualmente las variables env porque no se encontraron durante el proceso de comstackción y tuve que mover manualmente los DLL a la carpeta virtualenv.

Y el guión se ve así:

 import numpy as np import pandas as pd import tkinter as tk root = tk.Tk() root.mainloop() 

Si comento a los import pandas as pd , todo funciona bien. Si agrego la importación de pandas obtengo el siguiente error:

 C:\path\to\project\build\exe.win-amd64-3.6>MyScript.exe Traceback (most recent call last): File "C:\path\to\Envs\MyEnv\lib\site-packages\cx_Freeze\initscripts\__startup__.py", line 14, in run module.run() File "C:\path\to\Envs\MyEnv\lib\site-packages\cx_Freeze\initscripts\Console.py", line 26, in run exec(code, m.__dict__) File "MyScript.py", line 2, in  File "C:\path\to\Envs\MyEnv\lib\site-packages\pandas\__init__.py", line 23, in  from pandas.compat.numpy import * File "C:\path\to\Envs\MyEnv\lib\site-packages\pandas\compat\__init__.py", line 32, in  from distutils.version import LooseVersion File "C:\path\to\Envs\MyEnv\lib\distutils\__init__.py", line 17, in  real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ('', '', imp.PKG_DIRECTORY)) File "C:\path\to\Envs\MyEnv\lib\imp.py", line 245, in load_module return load_package(name, filename) File "C:\path\to\Envs\MyEnv\lib\imp.py", line 217, in load_package return _load(spec) File "", line 683, in _load AttributeError: 'NoneType' object has no attribute 'name' 

He visto muchas preguntas de desbordamiento de foros y astackmientos en línea (en realidad tuve que corregir muchos errores para llegar aquí), pero no puedo averiguar qué es lo que falta en cx_Freeze.

He desinstalado y reinstalé pandas, desinstalé cx_Freeze e intenté instalar una versión anterior (la instalación falló, pero esa es una pregunta SO diferente). De hecho, probé pyinstaller y py2exe pero hubo tantos errores que fueron menos detallados (más difíciles de solucionar) que abandoné cualquier cosa que no fuera cx_Freeze para crear el ejecutable.

¿Alguien puede ayudar?

En la versión 5.1.1 de cx_Freeze , los módulos incluidos se encuentran en un subdirectorio lib del directorio de comstackción. Las DLL añadidas manualmente, aparentemente, necesitan ser movidas allí también.

Puedes hacer esto con la siguiente modificación de tu script setup.py:

 options = { 'build_exe': { 'packages': packages, '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')), (os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'sqlite3.dll'), os.path.join('lib', 'sqlite3.dll')) ], }, } 

En realidad no estoy seguro de si sqlite3.dll también necesita ser movido a lib .

Su pregunta es interesante en vista del hecho de que parece indicar un conflicto de importación entre pandas y tkinter . Es probable que esa sea la razón por la que recibe un mensaje de error diferente al que se informa en esta pregunta:
Obteniendo “ImportError: error en la carga de DLL: no se pudo encontrar el módulo especificado” al usar cx_Freeze incluso con tcl86t.dll y tk86t.dll agregado en

EDITAR: main.py congelar y ejecutar el script de ejemplo main.py del OP sin errores utilizando Python 3.6.5 en Windows 7 con la siguiente configuración

idna 2.7 (instalado con pip)
numpy 1.14.3 + mkl (instalado con los binarios de Gohlke )
pandas 0.23.4 (instalado con pip)
cx_Freeze 5.1.1 (instalado con pip)

Yo uso el siguiente script setup.py :

 import os import sys from cx_Freeze import setup, Executable PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__)) 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') base = None if sys.platform == "win32": base = "Win32GUI" executables = [Executable("main.py", base=base)] packages = ["idna", "os", "numpy", "importlib", "pandas"] options = { 'build_exe': { 'packages': packages, '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')), (os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'sqlite3.dll'), os.path.join('lib', 'sqlite3.dll')) ], }, } setup( name="MyScript", options=options, version="0.1", description='Placeholder desc', executables=executables )