2016-06-30 32 views
1

Ich habe gearbeitet, um eine Python-ausführbare Datei für OSX El Capitan zu bekommen, und ich bekomme die ausführbare Datei mit Pyinstaller und cx_Freeze erstellt, kommt das Problem wann Ich starte die ausführbare Datei auf einem anderen Mac. Der Fehler, den ich erhalte, ist, dass ich die .db-Datei, die in meinem Hauptskript referenziert wird, nicht finden kann. Daher habe ich mir die Dokumentation für beide Programme angeschaut und sys.MEIPASS (Pyinstaller) und sys.executable (cx_Freeze) gefunden, um Datendateien einzuschließen die --onefile App. Dies ist der Code, den ich in meinem Haupt-Skript verwendet:Wie man Pyinstaller - cx_Freeze ausführbare sys.MEIPASS/sys.executable

def find_data_file(filename): 
    if getattr(sys, 'frozen', False): 
     # The application is frozen 
     datadir = os.path.dirname(sys._MEIPASS) #in cx_Freeze this is sys.executable  
    else: 
     # The application is not frozen 
     # Change this bit to match where you store your data files: 
     datadir = ospath.abspath(os.pardir) 

    return os.path.join(datadir, filename) 

#This is how im using the "find_data_file" function in my code. 
dbpath = find_data_file('PubData.db') 
conn = lite.connect(dbpath) 

ive es ein wenig in der else-Anweisung änderte das Layout meiner Projektverzeichnisse übereinstimmen, und es funktioniert völlig in Ordnung, wenn eine nicht gefrorene Anwendung ausgeführt wird. Wenn ich jedoch versuche, mit der gebauten ausführbaren Datei zu laufen, gibt es mir einen Fehler, weil ich die .db-Datei nicht finden konnte, was ich dachte, wenn ich auf sys.MEIPASS oder sys.executable referenziere.

Fehler:

Traceback (most recent call last): 
    File "interface/GUI.py", line 673, in <module> 
    File "interface/GUI.py", line 82, in __init__ 
    File "interface/GUI.py", line 212, in getServerNames 
sqlite3.OperationalError: no such table: servernames 

Dies ist, wie meine Dateibaum aussieht:

PubData-master ##(Project Root Directory) 
    Interface ##(Directory) 
     GUI.py ##(Main Script, this is where i reference 'PubData.db') 
     GUI.speC##(Pyinstaller spec file) 
    PubData.db ## This is my database file, in the PubData-master Directory 

Wenn jemand könnte mir sagen, was ich falsch mache, oder geben Sie mir eine Lösung, würde ich sehr dankbar sein !

Antwort

0

Wenn Sie versuchen, auf eine Datei zuzugreifen, die Sie in der .spec-Datei angegeben haben, müssen Sie in Ihrem Code den Ordner _MEIPASS von Pyinstaller verwenden, um auf Ihre Datei zu verweisen. Hier ist, wie ich tat es mit der Datei mit dem Namen Data.db:

import sys 
import os.path 

     if hasattr(sys, "_MEIPASS"): 
      datadir = os.path.join(sys._MEIPASS, 'Data.db') 
     else: 
      datadir = 'Data.db' 

     conn = lite.connect(datadir) 

dies die folgende Zeile ersetzt:

conn = lite.connect("Data.db") 

Dieser Link erklärt sehr gut: https://irwinkwan.com/2013/04/29/python-executables-pyinstaller-and-a-48-hour-game-design-compo/