2013-10-29 2 views
10

Diese question wurde zuvor gefragt, und ich kann nicht scheinen, meine PyInstaller ordnungsgemäß zu funktionieren. Ich habe den folgenden Code in meiner mainscript.py Datei aufgerufen:Das Bündeln von Datendateien mit PyInstaller 2.1 und MEIPASS-Fehler --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) 

Wenn ich die py-Datei (im IDLE) laufen, meine app läuft perfekt und lädt alle Datendateien. Allerdings, wenn ich bündeln es mit PyInstaller 2.1 (eine Datei-Methode) bekomme ich folgende Fehlermeldung nach der exe baut:

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/*.*' 

Hat jemand eine Idee, wo ich schief gelaufen? Vielen Dank!

** EDIT **

Hier ist genau das, was ich tun möchte.

Mein Hauptskript hat ein Setup (Importe), die wie folgt aussehen. Im Grunde möchte ich in der Lage sein zu haben Matplotlib, Basemap und Ressourcenpfad alles drin:

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' 

Ich bin mit PyInstaller 2.1. Ich benutze auch Python 2.7.5 (32 Bit). Mein Betriebssystem ist Windows 8 (64bit). Meine Matplotlib ist 1.3.0 und Basemap ist 1.0.6. Wxpython ist 2.8.12.1 (Unicode).

Ich gehe zum Befehl und tun: > pyinstaller myscript.py. Dies erzeugt meine .spec-Datei, die ich leicht bearbeite. Unten ist meine editierten Spec-Datei:

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

ich dies mit einer Datei ausführbar sein will, so sollten die Daten-Dateien innerhalb der ausführbaren Datei gepackt werden. Auf anderen pininstallers hatte ich normalerweise keine Probleme mit dem MEIPASS. Allerdings muss ich 2.1 wegen Matplotlib und Grundkarte verwenden. Wenn jemand diese exe perfekt bauen kann - kannst du mir bitte sagen, was ich anpassen muss? Vielen Dank!

**** EDIT ****

Wenn jemand herausfinden, wie dies mit py2exe zu tun - das zu groß wäre. Jede Art, wie ich das in eine einzelne ausführbare Datei bringen kann, wäre es wert!

+0

Ich bin nicht sicher, dass dies das Problem hier ist, aber die Pypi-Version von Pyinstaller 2.1 scheint eine Reihe von Fehlern zu haben, versuchen Sie die Git-Version unter https://github.com/pyinstaller. –

+0

Ich habe die eine Seite von pyinstaller.org heruntergeladen - ist das das Gleiche wie von pypi? – mcfly

+0

würde ich so erwarten. Sie sind beide die 2.1-Version. –

Antwort

11

Ich denke, ich sehe das Problem. Sie geben data_files nicht in Ihr Analysis-Objekt ein. Hier ist, wie ich meine Daten-Dateien in meiner .spec Datei hinzufügen:

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

Hinweis Ich bin nicht mit COLLECT() überhaupt.

Wenn Sie die 2.1 Dokumentation unter: PyInstaller Spec File Operation auschecken, werden Sie feststellen, dass COLLECT() nicht für den --onefile-Modus verwendet wird.

Wenn Sie sich das extrahierte Verzeichnis ansehen, auf das sys._MEIPASS zeigt, werden Sie wahrscheinlich feststellen, dass die Datendatei mit Ihrer Spezifikationsdatei gar nicht vorhanden ist.

Ich hoffe, das hilft.

Verwandte Themen