2013-10-29 7 views
10

Questo question è stato richiesto in precedenza e non riesco a far funzionare correttamente il mio PyInstaller. Ho invocato il seguente codice nel mio file mainscript.py:Raggruppamento di file di dati con PyInstaller 2.1 e errore MEIPASS --onefile

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) 

Quando eseguo il file py (in un raggio IDLE), la mia app funziona perfettamente e carica tutti i file di dati. Tuttavia, quando ho bundle con PyInstaller 2.1 (un metodo file) ottengo il seguente errore dopo l'exe costruisce:

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

Qualcuno ha qualche idea di dove ho sbagliato? Grazie!

** EDIT **

Ecco esattamente quello che voglio fare.

Il mio script principale ha un'impostazione (importazioni) simile a quella riportata di seguito. In sostanza voglio essere in grado di avere Matplotlib, Basemap, e il percorso delle risorse in esso tutto:

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' 

Sto usando PyInstaller 2.1. Sto anche usando Python 2.7.5 (32 bit). Il mio sistema operativo è Windows 8 (64 bit). My Matplotlib è 1.3.0 e Basemap è 1.0.6. Wxpython è 2.8.12.1 (Unicode).

Vado al comando e faccio: > pyinstaller myscript.py. Questo genera il mio file .spec che modifico leggermente. Qui di seguito è il mio modificato il file spec:

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') 

io voglio che questo sia un file eseguibile un file in modo che i file di dati devono essere imballati all'interno dell'eseguibile. Su altri pyinstaller di solito non ho avuto problemi con MEIPASS. Tuttavia, ho bisogno di usare 2.1 a causa di Matplotlib e Basemap. Se qualcuno può costruire questo exe perfettamente - puoi dirmi per favore cosa devo aggiustare? Grazie!

**** **** EDIT

Se qualcuno riesce a capire come fare questo con py2exe - che sarebbe troppo grande. Ne potrebbe valere la possibilità di ottenere questo in un singolo file eseguibile!

+0

Non sono sicuro che questo sia il problema, ma la versione pypi di Pyinstaller 2.1 sembra avere un sacco di bug, prova ad usare la versione git su https://github.com/pyinstaller. –

+0

Ho scaricato l'unico file pyinstaller.org - è come ottenere da pypi? – mcfly

+0

Mi aspetterei così. Sono entrambi la versione 2.1 di rilascio. –

risposta

11

Penso di vedere il problema. Non stai alimentando data_files nell'oggetto Analysis. Ecco come aggiungo i miei file di dati nel mio file .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') 

Avviso non sto usando RACCOGLIERE() a tutti.

Se si esegue il checkout della documentazione 2.1 al numero: PyInstaller Spec File Operation, si noterà che COLLECT() non viene utilizzato per la modalità --onefile.

Se si guarda la directory estratta puntata da sys._MEIPASS, probabilmente si noterà che con il proprio file di specifiche il file di dati semplicemente non c'è affatto.

Spero che questo aiuti.