Agrupar archivos de datos con PyInstaller 2.1 y MEIPASS error –onefile

Esta pregunta se ha hecho antes y parece que no puedo hacer que mi PyInstaller funcione correctamente. He invocado el siguiente código en mi archivo mainscript.py:

def resource_path(relative_path): """ Get absolute path to resource, works for dev and for PyInstaller """ try: # PyInstaller creates a temp folder and stores path in _MEIPASS base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) 

Cuando ejecuto el archivo py (dentro de IDLE), mi aplicación se ejecuta perfectamente y carga todos los archivos de datos. Sin embargo, cuando lo empaqueté con PyInstaller 2.1 (un método de archivo) obtengo el siguiente error después de que se comstack el archivo ejecutable:

 Traceback (most recent call last): File "", line 37, in  WindowsError: [Error 3] The system cannot find the path specified: 'C:\\Users\\Me\\AppData\\Local\\Temp\\_MEI188722\\eggs/*.*' 

¿Alguien tiene alguna idea de dónde me equivoqué? ¡Gracias!

** EDIT **

Aquí es exactamente lo que quiero hacer.

Mi script principal tiene una configuración (importaciones) que se ve a continuación. Esencialmente, quiero poder tener Matplotlib, mapa base y ruta de recursos:

 import os,sys import matplotlib matplotlib.use('WX') import wx from matplotlib.backends.backend_wx import FigureCanvasWx as FigureCanvas from matplotlib.backends.backend_wx import NavigationToolbar2Wx from mpl_toolkits.basemap import Basemap from matplotlib.figure import Figure import matplotlib.pyplot as plt import Calculate_Distance # A personal py file of mine def resource_path(relative_path): """ Get absolute path to resource, works for dev and for PyInstaller """ try: # PyInstaller creates a temp folder and stores path in _MEIPASS base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) bmap=wx.Bitmap(resource_path('test_image.png')) print 'hello' 

Estoy usando PyInstaller 2.1. También estoy usando Python 2.7.5 (32 bit). Mi sistema operativo es Windows 8 (64 bits). Mi Matplotlib es 1.3.0 y el mapa base es 1.0.6. Wxpython es 2.8.12.1 (Unicode).

Voy a mandar y hago: > pyinstaller myscript.py . Esto genera mi archivo .spec que edito ligeramente. A continuación se encuentra mi archivo de especificaciones editado:

 data_files = [('Calculate_Distance.py', 'C:\\Users\\Me\\Documents\\MyFolder\\Calculate_Distance.py', 'DATA'), ('test_image.png', 'C:\\Users\\Me\\Documents\\MyFolder\\test_image.png', 'DATA')] includes = [] excludes = ['_gtkagg', '_tkagg', 'bsddb', 'curses', 'email', 'pywin.debugger', 'pywin.debugger.dbgcon', 'pywin.dialogs', 'tcl', 'Tkconstants', 'Tkinter'] packages = [] dll_excludes = [] dll_includes = [] a = Analysis(['myscript.py'], pathex=['C:\\Users\\Me\\Documents\\MyFolder','C:\\Python27\\Lib\\site-packages\\mpl_toolkits\\basemap\\*'], hiddenimports=[], hookspath=None, runtime_hooks=None) pyz = PYZ(a.pure) exe = EXE(pyz, a.scripts, a.binaries - dll_excludes + dll_includes + data_files, name='MyApplication.exe', debug=False, strip=None, upx=True, console=True ) coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=None, upx=True, name='MyApplication') 

Quiero que este sea un archivo ejecutable de un solo archivo, por lo que los archivos de datos deben estar empaquetados dentro del archivo ejecutable. En otros pyinstallers por lo general no he tenido problemas con el MEIPASS. Sin embargo, necesito usar 2.1 debido a Matplotlib y al mapa base. Si alguien puede construir este exe perfectamente, ¿puede decirme qué debo ajustar? ¡Gracias!

****EDITAR****

Si alguien puede descubrir cómo hacer esto con py2exe, eso también sería genial. ¡De cualquier manera que pueda obtener esto en un solo ejecutable valdría la pena!

Creo que veo el problema. No estás alimentando archivos de datos en tu objeto de Análisis. Así es como agrego mis archivos de datos en mi archivo .spec:

 a = Analysis(....) a.datas += [('7z.dll', '7z.dll', 'DATA')] a.datas += [('7z.exe', '7z.exe', 'DATA')] a.datas += [('collection.xml', 'collection.xml', 'DATA')] a.datas += [('License.html', 'License.html', 'DATA')] pyz = PYZ(a.pure) exe = EXE(pyz, a.scripts + [('O', '', 'OPTION')], a.binaries, a.zipfiles, a.datas, name=os.path.join('dist', 'blah.exe'), debug=False, strip=None, upx=False, console=True, icon=r'..\NCM.ico') 

Note que no estoy usando COLLECT () en absoluto.

Si verifica la documentación 2.1 en: Operación del archivo de especificaciones de PyInstaller , notará que COLLECT () no se usa para el modo –onefile.

Si observa el directorio extraído al que apunta sys._MEIPASS, probablemente notará que con su archivo de especificaciones el archivo de datos simplemente no está allí.

Espero que esto ayude.