2016-03-30 12 views
0

Ich weiß, dass diese Frage schon oft gestellt wurde, aber nachdem ich die Antworten durchgelesen habe, kann ich nicht herausfinden, was falsch läuft.Pyinstaller "return -1"

Ich habe ein Python-Skript (unten) und ich versuche Pyinstaller zu verwenden, um es in eine ausführbare Datei zu machen (ich bin auf Windows).

Als ich in dem Verzeichnis meiner Plot.py Datei bin, tippe ich in die Eingabeaufforderung ein:

pyinstaller.exe --onefile --windowed Plot.py 

Es dann die EXE-Datei erfolgreich erstellt, aber wenn ich versuche, es zu öffnen, erscheint ein Fenster mit dem Titel "Fataler Fehler!" das sagt "Plot gab -1 zurück".

Ich habe ausführbare Dateien vor der Verwendung von Pyinstaller aus Python-Skripten mit Tkinter und tkFileDialog gemacht. Von dem, was ich erforscht habe, unterstützt Pyinstaller Matplotlib.

Irgendwelche Ideen was schief läuft?

Plot.py unter:

''' 
Plot.py 
Opens a GUI and allows users to select text files with five columns: x, y, z, t, e 
Then, it makes two graphs and shows them - x vs y vs z and e vs t 
''' 

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import tkFileDialog 
from Tkinter import * 

def get_name_from_file(path): 
    ''' 
    takes a path and returns just the name of the file 
    i.e. C:/Users/joe.iosue/Documents/helloworld.txt returns helloworld.txt 
    ''' 
    while path.count("/") > 0: 
     i = path.index("/") 
     path = path[i+1:] 
    return path 

def make_plot(x, y, z, title): 
    ''' 
    returns a plt object that can be saved to show later 
    x, y, z are lists of floats, but the 0th index is a string: the title of that axes. 
    title is a string 
    ''' 
    fig = plt.figure() 
    #If there is no z list, the graph should only be 2d (energy vs time) 
    if z != None: 
     plot = fig.add_subplot(111, projection='3d') 
     plot.set_zlabel(z[0]) 
     plot.scatter(x[1:], y[1:], z[1:], c='r', marker='o') 
     plot.set_xlabel(x[0]) 
     plot.set_ylabel(y[0]) 
     plot.set_zlabel(z[0]) 
    else: 
     plt.plot(x[1:], y[1:], c='r', marker='o') 
     plt.xlabel(x[0]) 
     plt.ylabel(y[0]) 
    plt.title(title) 
    return plt 

class Graph(object): 
    ''' 
    Reads from a file that has 5 columns: x, y, z, t, KE 
    There are two graphs: a position graph (x, y, z) 
    and a Kinetic energy vs Time graph (t, KE) 
    ''' 
    def __init__(self, filename, xlabel='X', ylabel='Y', zlabel='Z', tlabel='t', elabel='KE', title='Title'): 
     self.title = title 
     f = open(filename, 'r') 
     data = f.readlines() 
     f.close() 
     #first index of the lists are what I am going to name the axes 
     self.xList, self.yList, self.zList, self.tList, self.eList = [xlabel], [ylabel], [zlabel], [tlabel], [elabel] 
     lines = [] 
     for element in data: 
      lines.append(element.split()) 
     for element in lines: 
      #In case I decide later to add comments in my text file with the points 
      #I added this try statement so it won't add a comment to the point lists 
      try: 
       self.xList.append(float(element[0])) 
       self.yList.append(float(element[1])) 
       self.zList.append(float(element[2])) 
       self.tList.append(float(element[3])) 
       self.eList.append(float(element[4])) 
      except: 
       pass 
    def plot_position(self): 
     make_plot(self.xList, self.yList, self.zList, self.title).show() 
    def plot_energy(self): 
     make_plot(self.tList, self.eList, None, self.title).show() 
    def plot_both(self): 
     ''' 
     matplotlib works in global frame, so this makes both plots 
     (x vs y vx z and ke vs t) in global frame and then shows both 
     at the same time 
     ''' 
     make_plot(self.xList, self.yList, self.zList, self.title) 
     make_plot(self.tList, self.eList, None, self.title).show() 

class OpenDialogMenu(object): 
    ''' 
    opens file menu only allowing text files to be chosen 
    ''' 
    def __init__(self, master): 
     self.master = master 
     self.file_options = options = {} 
     options['defaultextension'] = '.txt' 
     options['filetypes'] = [('TXT files', '.txt')] 
     options['initialdir'] = 'C:\Documents' 
     options['parent'] = self.master 
     options['title'] = 'Open File Menu' 
     self.filename = tkFileDialog.askopenfile(mode="r", **self.file_options) 
    def get_filename(self): 
     ''' 
     If user opens file menu and then closes it without picking 
     a file, should return None 
     ''' 
     try: 
      return self.filename.name 
     except: 
      return None 

class Home(object): 
    ''' 
    master is a Tk window 
    Home can store multiple text files ready to plot 
    ''' 
    def __init__(self, master): 
     self.master = master 
     self.master.title('Plot') 
#  In case the icon file is not in the correct directory 
     try: 
      self.master.wm_iconbitmap("ploticon.ico") 
     except: 
      pass 
     self.open= Button(self.master, text='Open', command=self.Open, width=10) 
     self.plot = Button(self.master, text='Plot', command=self.Plot, width=10) 
     self.plot.grid(row=0, column=0) 
     self.open.grid(row=0, column=1) 
     self.row = 1 
     self.files, self.labels = [], [] 

     self.menubar = Menu(self.master) 
     self.filemenu = Menu(self.menubar, tearoff=0) 
     self.menubar.add_cascade(label="File", menu=self.filemenu) 
     self.filemenu.add_command(label="New", command=self.New) 
     self.filemenu.add_command(label="Open", command=self.Open) 
     self.filemenu.add_command(label="Reset", command=self.delete_files) 
     self.filemenu.add_separator() 
     self.filemenu.add_command(label="Exit", command=self.master.destroy) 
     self.master.config(menu=self.menubar) 

     self.master.bind('<Control-o>', self.Open) 
     self.master.bind('<Return>', self.Plot) 
     self.master.bind('<Control-n>', self.New) 
     self.master.bind('<Control-r>', self.delete_files) 

    def Open(self, callback=False): 
     ''' 
     opens the open dialog menu and adds the chosen file to self.files 
     and adds a label to the window with name of file 
     ''' 
     f = OpenDialogMenu(self.master) 
     self.filename = f.get_filename() 
     if self.filename != None: 
      name = get_name_from_file(self.filename) 
      self.labels.append(Label(self.master, text=name)) 
      self.labels[len(self.labels)-1].grid(row=self.row, columnspan=50) 
      self.row+=1 
      self.files.append(Graph(filename=self.filename, title=name)) 

    def Plot(self, callback=False): 
     ''' 
     plots plt objects 
     ''' 
     for element in self.files: 
      element.plot_both() 

    def New(self, callback=False): 
     ''' 
     opens new tkinter window with Home attributes 
     ''' 
     root = Tk() 
     Home(root) 
     root.mainloop() 

    def delete_files(self, callback=False): 
     ''' 
     removes all files from file and label list 
     ''' 
     for element in self.labels: 
      element.destroy() 
     self.labels = [] 
     self.files = []  

if __name__ == '__main__': 
    root = Tk() 
    Home(root) 
    root.mainloop() 

Ich sollte erwähnen, die py-Datei funktioniert.

Ich weiß, dass der Code ein bisschen erfunden ist, aber es funktioniert genau, wie ich will, dass es funktioniert, für das, was ich brauche.

+0

Hoppla, tut mir leid, bemerkte nicht, dass Sie unter Windows laufen. Versuchen Sie diese strace analog und veröffentlichen Sie die Ergebnisse - http://msdn.microsoft.com/en-us/library/windows/hardware/ff552060(v=vs.85).aspx – Samuel

+0

Run pyinstaller ohne '-windowed' zu bekommen eine vollständige Fehlerverfolgung in der Befehlszeile. – codewarrior

+0

@codewarrior Gute Idee! Ich habe "ImportError: Kein Modul namens FixTk" – Joe

Antwort

0

Versuchen Sie, jeden ersetzen exit() oder quit() oder os._exit() mit sys.exit() ... Ich sehe, dass Sie müssen nicht jede von diesen in ur-Code, aber jemand anderes dieses nützlich finden könnten ... Hoffe, es hilft :)

myinfo: python3.4, pyinstaller3.1.1