PyInstaller

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Hallo ihr lieben Python Entwickler!

Stehe leider vor einem Problem mit dem PyInstaller!
Habe nun etliche Versuche hinter mir und auch das Internet ist mir gerade nicht so wirklich Behilflich :?

Wie ist die beste Vorgangsweise?
Nutze Anaconda und mit
pip install PyInstaller habe ich bereits installiert

Das ist alles was ich importiere

Code: Alles auswählen

import sys
from qtpy import QtWidgets
from ui.mainwindow import Ui_asc_File_Reader
import pandas as pd
from easygui import fileopenbox, diropenbox
from functools import partial
import plotly.graph_objects as go
import plotly
John
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und was soll dieses Problem sein? Was probierst du, was sind erwarteten Ergebnisse, was passiert stattdessen? Welche Fehlermeldungen bekommst du?

So wie du dein Problem bisher beschreibst kann man auch nur sagen "fuer andere Leute funktionierts".
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die importe reichen nicht. Lies nochmal meine andere Antwort & beantworte die Fragen darin.
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`easygui` (Tk) und Qt zu mixen ist keine gute Idee bis hin zu: das kann Probleme machen. Qt hat auch Dateidialoge, die muss man sich nicht von woanders her holen.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

@__blackjack__
Danke für den Hinweis! Ich brauche nur ein äquivalent zu:

Code: Alles auswählen

self.file = easygui.fileopenbox(msg="Please locate the asc file", title="Specify File", default="I:\*.asc")
und

Code: Alles auswählen

self.file2 = easygui.diropenbox(msg="Please locate the directory to save", title="Specify File")
Ich bin noch nicht so gut in Python :roll:


Und eine Fehlermeldung bekomme ich wenn ich das .exe öffnen möchte:
File "site-packages\qtpy\__init__.py", line 210 in <module> qtpy.PythonQtError: No Qt Bindings could be found
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Hey, das wären bei QT soweit ich weiß

QFileDialog.getOpenFileNames() und QFileDialog.getSaveFileName()
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JohannX: Man wird da wohl noch explizit ein Qt-Binding angeben müssen, das mit in die EXE eingebunden wird. Wobei an der Stelle dann `qtpy` anfängt keinen Sinn mehr zu machen wenn Du das Qt-Binding mit auslieferst. Dann kannst du auch PyQt oder PySide *direkt* nehmen, je nach dem welche Lizenz besser zu Dir passt. Also ob Du den Quelltext für die Benutzer der EXE zur Verfügung stellen müssen möchtest oder nicht.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

@__blackjack__
Nein musste ich nicht, ich gebe einfach folgenden Befehl ein sobald ich in den Ordner Navigiert habe (Im Terminal als Admin):
pyinstaller Filename.py --onefile
Und schon läuft das Teil...
Nach gefühlt 10min erscheint dann die exe, diese lässt sich auch Starten und das Fenster geht auch auf. Aber sobald ich auf export to html klicke Stürzt es ab und die oben erwähnte Fehlermeldung erscheint im Terminal
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Jankie hat geschrieben: Mittwoch 24. Juli 2019, 09:04 Hey, das wären bei QT soweit ich weiß

QFileDialog.getOpenFileNames() und QFileDialog.getSaveFileName()
Danke, habe es nun importiert:

Code: Alles auswählen

from PyQt5.QtWidgets import QFileDialog
bekomme jedoch diese Fehlermeldung:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-dbf494ed2562> in choose_button(self)
43 self.file = QFileDialog.getOpenFileNames()
44 # Zeigt den Pfad der Datei an
---> 45 self.ui.Info1.setText(self.file)
46
47 # Anzeige auf der rechten Seite mit YES oder NO

TypeError: setText(self, str): argument 1 has unexpected type 'tuple'
Benutzeravatar
snafu
User
Beiträge: 6866
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

getOpenFileNames() gibt auch eine Liste zurück. Davon musst du dann entweder den ersten Eintrag nehmen oder direkt die Variante ohne dem "s" am Ende nehmen. Die gibt wahrscheinlich eher zurück, was du erwartest.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Danke snafu
Aber der Fehler bleibt trotzdem der selbe
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-34e54b1d5f2d> in choose_button(self)
43 self.file = QFileDialog.getOpenFileName()
44 # Zeigt den Pfad der Datei an
---> 45 self.ui.Info1.setText(self.file)
46
47 # Anzeige auf der rechten Seite mit YES oder NO

TypeError: setText(self, str): argument 1 has unexpected type 'tuple'
Benutzeravatar
snafu
User
Beiträge: 6866
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Was ergibt denn die Ausgabe von print(type(self.ui.Info1)) ?
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

mit

Code: Alles auswählen

self.ui.Info1.setText(str(self.file))
sollte es klappen.
Benutzeravatar
snafu
User
Beiträge: 6866
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Jankie: Bei PyQt5 wie auch bei PySide2 bekommt man direkt "echte" Python-Strings und keine QStrings mehr. Entsprechend ist eine QStringList nun einfach eine Python-Liste mit Strings. Außerdem passt das bei genauerem Hinsehen auch gar nicht zur Fehlermeldung, wo ja von einem Tupel die Rede ist.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Wie auch immer, mit dem Tipp von Jankie hat das nun geklappt!
Danke dir :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@Jankie: was nicht passt wird passend gemacht? Gerne auch mit dem groben 🔨?

Der Rueckgabewert ist ein Tupel aus Dateiname und Dateityp:

Code: Alles auswählen

('/home/user/package.list', 'All Files (*)')
Also muss man auf das gewuenschte Element zugreifen, am besten so:

Code: Alles auswählen

filename, _ = QFileDialog.getOpenFileName()
@JohannX: wenn sowas passiert, printe dir den Wert vorher mal aus, damit du lernst, wie der beschaffen ist.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

JohannX hat geschrieben: Mittwoch 24. Juli 2019, 10:08 Wie auch immer, mit dem Tipp von Jankie hat das nun geklappt!
Nein, hat es nicht. Oder willst du irgendwann mal mit dem Dateinamen was anfangen? Dann ist der IMMER noch ein Tupel, und fliegt dir immer noch um die Ohren. Das Problem hat sich nur verlagert 🤷‍♂️
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Nun bekomme ich leider eine neue Fehlermeldung :(
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-1-f4b9f41d41bd> in on_html_click(self)
106
107 # Sortiert die Daten
--> 108 self.df_all = pd.read_csv(self.file, skiprows=5, delimiter=";", converters={' DATA L': partial(int, base=16)})
109
110 # Schneidet den nur Filenamen raus und speichert diesen in eine neue Variable

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, tupleize_cols, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision)
700 skip_blank_lines=skip_blank_lines)
701
--> 702 return _read(filepath_or_buffer, kwds)
703
704 parser_f.__name__ = name

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds)
411 compression = _infer_compression(filepath_or_buffer, compression)
412 filepath_or_buffer, _, compression, should_close = get_filepath_or_buffer(
--> 413 filepath_or_buffer, encoding, compression)
414 kwds['compression'] = compression
415

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\common.py in get_filepath_or_buffer(filepath_or_buffer, encoding, compression, mode)
230 if not is_file_like(filepath_or_buffer):
231 msg = "Invalid file path or buffer object type: {_type}"
--> 232 raise ValueError(msg.format(_type=type(filepath_or_buffer)))
233
234 return filepath_or_buffer, None, compression, False

ValueError: Invalid file path or buffer object type: <class 'tuple'>
Tut mir sehr leid dass ich euch mit meinen Fehlern nerve, aber ich habe derzeit keinen Kopf mehr dafür. Sitze nun den 2. Tag in folge an diesem Problem, dass ich es nicht in eine exe File exportieren kann
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du meine Antworten gelesen? Da habe ich dir das vorhergesagt. Und dir gezeigt, wie man es richtig macht. Lesen was dir Leute hier schreiben musst du schon. Sonst geht's nicht.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

__deets__ hat geschrieben: Mittwoch 24. Juli 2019, 10:22 Hast du meine Antworten gelesen? Da habe ich dir das vorhergesagt. Und dir gezeigt, wie man es richtig macht. Lesen was dir Leute hier schreiben musst du schon. Sonst geht's nicht.
Keine Sorge, ich lese schon. Aber du hast es anscheinend kurz vor mir die Antwort geschrieben.
Nun funktioniert es soweit ohne easygui :)

Danke!

Bei diesem Code:

Code: Alles auswählen

self.file2, _ = QFileDialog.getSaveFileName()
Muss ich aber immer ne Datei auswählen, aber ich möchte nur einen Ordner auswählen wohin die Datei gespeichert wird.
Könnte es dann so aussehen?

Code: Alles auswählen

self.file2, _ = QFileDialog.getSaveDirName()
Antworten