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.
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
Run pyinstaller ohne '-windowed' zu bekommen eine vollständige Fehlerverfolgung in der Befehlszeile. – codewarrior
@codewarrior Gute Idee! Ich habe "ImportError: Kein Modul namens FixTk" – Joe