PyInstaller
... und eventuell mal eine Pause einlegen, wenn der Kopf voll ist und es einem zu viel wird. Mit einem str()-Aufruf macht man alles mögliche zu einem String. Dass der Inhalt des Strings dabei im benötigten Kontext sinnvoll ist, wird damit *nicht* garantiert. Wurde hier am Beispiel ja eindrucksvoll gezeigt und auch durch __deets__ erläutert.
Den Code habe ich aus der Konversation hier. Das der nicht passt wusste ich nicht.
Und du kannst dir nicht einfach Methodennamen ausdenken. Hast du mal in die Dokumentation von QFileDialog geschaut? Was es da so an Methodennamen gibt? Da gibt's was das passt. Aber dann ist der Rueckgabewert wieder nur ein String!
Und du kannst dir nicht einfach Methodennamen ausdenken. Hast du mal in die Dokumentation von QFileDialog geschaut? Was es da so an Methodennamen gibt? Da gibt's was das passt. Aber dann ist der Rueckgabewert wieder nur ein String!
Hab ich schon gefunden
Code: Alles auswählen
# Speicherort wählen
self.file2 = QFileDialog.getExistingDirectory()
# Zeigt den Pfad an wo gespeichert wird
self.ui.Info2.setText(str(self.file2))
Anscheinend aber nicht die Ratschläge von __deets__ richtig beherzigt, da getExistingDirectory() dir bereits einen String zurückgibt, ist die Umwandlung von file2 bei self.ui.Info2.setText(str(self.file2)) zu einem String überflüssig.
Habs jetzt BerücksichtigtJankie hat geschrieben: Mittwoch 24. Juli 2019, 11:45 Anscheinend aber nicht die Ratschläge von __deets__ richtig beherzigt, da getExistingDirectory() dir bereits einen String zurückgibt, ist die Umwandlung von file2 bei self.ui.Info2.setText(str(self.file2)) zu einem String überflüssig.
Code: Alles auswählen
# Speicherort wählen
self.file2 = QFileDialog.getExistingDirectory()
# Zeigt den Pfad an wo gespeichert wird
self.ui.Info2.setText(self.file2)
So nun zu meinem eigentlichen Problem.
Eine exe Datei kann ich erstellen, sobald ich die exe Datei öffne erscheint die Gewünschte GUI
Ich kann alles anhacken und die Datei auswählen und wohin diese dann gespeichert werden soll.
Aber sobald ich auf Export klicke bricht er ab und es erscheint folgende Fehlermeldung im cmd
installiert

Eine exe Datei kann ich erstellen, sobald ich die exe Datei öffne erscheint die Gewünschte GUI

Ich kann alles anhacken und die Datei auswählen und wohin diese dann gespeichert werden soll.
Aber sobald ich auf Export klicke bricht er ab und es erscheint folgende Fehlermeldung im cmd
plotly habe ich mitFileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\stf83wi\\AppData\\Local\\Temp\\_MEI37762\\plotly\\package_data\\templates\\plotly.json'
Code: Alles auswählen
pip install plotly
Code: Alles auswählen
#!/usr/bin/python3
# importieren
import sys
from qtpy import QtWidgets
from PyQt5.QtWidgets import QFileDialog, QLineEdit, QApplication
from ui.mainwindow import Ui_asc_File_Reader
import pandas as pd
from functools import partial
import plotly.graph_objects as go
import plotly
# Klasse MainWindow samt Konstruktor
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent = None):
super().__init__(parent)
self.setWindowTitle("Test")
self.ui = Ui_asc_File_Reader()
self.ui.setupUi(self)
# Verantortlich für das "Klick" wenn ein Button geklickt wird
self.ui.choose_button.clicked.connect(self.choose_button)
self.ui.ubatlogger.clicked.connect(self.ubatlogger)
self.ui.pressure.clicked.connect(self.pressure)
self.ui.temperature.clicked.connect(self.temperature)
self.ui.concentration.clicked.connect(self.concentration)
self.ui.level.clicked.connect(self.level)
self.ui.speedofsound.clicked.connect(self.speedofsound)
self.ui.choose_button_2.clicked.connect(self.choose_button_2)
self.ui.html_auto_open.clicked.connect(self.html_auto_open)
self.ui.export_to_html.clicked.connect(self.on_html_click)
self.ui.exit.clicked.connect(self.exit)
# Die html wird nach erstellung nicht automatisch geöffnet, außer man überschreibt diese mit html_auto_opem
self.var = False
# Falls kein asc File ausgewählt ist, wird beim Export to html Button nichts gemacht
self.file = None
def choose_button(self):
# Datei auswählen und trennen
self.file, _ = QFileDialog.getOpenFileName(self, 'Open file', 'c:\\',"Image files (*.asc)")
# Zeigt den Pfad der Datei an
self.ui.Info1.setText(self.file)
# Anzeige auf der rechten Seite mit YES oder NO
def ubatlogger(self):
if self.ui.ubatlogger.isChecked():
self.ui.pass1.setText("YES")
else:
self.ui.pass1.setText("NO")
def pressure(self):
if self.ui.pressure.isChecked():
self.ui.pass2.setText("YES")
else:
self.ui.pass2.setText("NO")
def temperature(self):
if self.ui.temperature.isChecked():
self.ui.pass3.setText("YES")
else:
self.ui.pass3.setText("NO")
def concentration(self):
if self.ui.concentration.isChecked():
self.ui.pass4.setText("YES")
else:
self.ui.pass4.setText("NO")
def level(self):
if self.ui.level.isChecked():
self.ui.pass5.setText("YES")
else:
self.ui.pass5.setText("NO")
def speedofsound(self):
if self.ui.speedofsound.isChecked():
self.ui.pass6.setText("YES")
else:
self.ui.pass6.setText("NO")
def choose_button_2(self):
# Speicherort wählen
self.file2 = QFileDialog.getExistingDirectory()
# Zeigt den Pfad an wo gespeichert wird
self.ui.Info2.setText(self.file2)
def html_auto_open(self):
# Auswahl, ob die html Datei automatisch geöffnet werden soll oder nicht
if self.ui.html_auto_open.isChecked():
self.var = True
else:
self.var = False
def on_html_click(self):
# Falls keine Datei ausgewählt ausgewählt ist, wird nichts gemacht beim Button Export to html
if self.file is None:
None
#
else:
# Erzeugung eines leeren Diagrammes
self.fig = go.Figure()
# Sortiert die Daten
self.df_all = pd.read_csv(self.file, skiprows=5, delimiter=";", converters={' DATA L': partial(int, base=16)})
# Schneidet den nur Filenamen raus und speichert diesen in eine neue Variable
file_title = self.file[self.file.rfind('\\')+1:len(self.file)]
# Das Layout für das Diagramm erstellen
self.fig.update_layout(title = go.layout.Title(text = file_title, xref = "paper", x = 0),
xaxis = go.layout.XAxis(title = go.layout.xaxis.Title(text = "Second [s]", font = dict(family = "Courier New, monospace", size = 20, color = "#7f7f7f"))),
yaxis = go.layout.YAxis(title=go.layout.yaxis.Title(text = "Values", font = dict(family = "Courier New, monospace", size = 20, color = "#7f7f7f"))))
# Fügt ubatlogger zum Diagramm hinzu
if self.ui.ubatlogger.isChecked():
df_ubatlogger = self.df_all[self.df_all[" DATA H"] == "800200BA"]
time_ubatlogger = df_ubatlogger[" Offset[s]"]
values_ubatlogger = df_ubatlogger[" DATA L"].apply(lambda x: x*(5/4095)*8.655106)
self.fig.add_trace(go.Scatter(x = time_ubatlogger, y = values_ubatlogger, mode = "lines", name = "Ubatlogger"))
# Fügt pressure zum Diagramm hinzu
if self.ui.pressure.isChecked():
df_pressure = self.df_all[self.df_all[" DATA H"] == "80083DCE"]
time_pressure = df_pressure[" Offset[s]"]
values_pressure = df_pressure[" DATA L"].apply(lambda x: (x -2)*0.00257038-0.5)
self.fig.add_trace(go.Scatter(x = time_pressure, y = values_pressure, mode = "lines", name = "Pressure"))
# Fügt temperature zum Diagramm hinzu
if self.ui.temperature.isChecked():
df_temperature = self.df_all[self.df_all[" DATA H"] == "80083DA5"]
time_temperature = df_temperature[" Offset[s]"]
values_temperature = df_temperature[" DATA L"].apply(lambda x: (x -1)*0.125-73.025)
self.fig.add_trace(go.Scatter(x = time_temperature, y = values_temperature, mode = "lines", name = "Temperature"))
# Fügt concentration zum Diagramm hinzu
if self.ui.concentration.isChecked():
df_concentration = self.df_all[self.df_all[" DATA H"] == "80083DEF"]
time_concentration = df_concentration[" Offset[s]"]
values_concentration = df_concentration[" DATA L"].apply(lambda x: (x -1)*0.05-20)
self.fig.add_trace(go.Scatter(x = time_concentration, y = values_concentration, mode = "lines", name = "Concentration"))
# Fügt level zum Diagramm hinzu
if self.ui.level.isChecked():
df_level = self.df_all[self.df_all[" DATA H"] == "80083DD6"]
time_level = df_level[" Offset[s]"]
values_level = df_level[" DATA L"].apply(lambda x: (x -1)*0.125)
self.fig.add_trace(go.Scatter(x = time_level, y = values_level, mode = "lines", name = "Level"))
# Fügt speedofsound zum Diagramm hinzu
if self.ui.speedofsound.isChecked():
df_speedofsound = self.df_all[self.df_all[" DATA H"] == "80083E09"]
time_speedofsound = df_speedofsound[" Offset[s]"]
values_speedofsound = df_speedofsound[" DATA L"].apply(lambda x: (x -1)*0.25+1000)
self.fig.add_trace(go.Scatter(x = time_speedofsound, y = values_speedofsound, mode = "lines", name = "Speed of Sound"))
# Diagramm erstellen
plotly.offline.plot(self.fig, filename = self.file + ".html", auto_open = self.var)
# Sauberes Schließen des Programmes
def exit(self):
sys.exit()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
Es gibt eine kleine Dokumentation darüber, aber soweit nichts brauchbares!Das hat nichts mit dem Python-Code zu tun, sondern da wird plotly nicht richtig gebuendelt. PyInstaller braucht Hilfe dabei zu wissen, dass diese JSON-Datei dazu gehoert. Dazu sollte es Dokumentation geben.
https://pyinstaller.readthedocs.io/en/s ... files.html
Der einzige Befehl den ich jetzt mal "brauchen" könnte wäre
Code: Alles auswählen
pyinstaller --add-data 'src/README.txt:.' myscript.py
Code: Alles auswählen
pyinstaller --add-data 'src/plotly.json' ascFileReader.py
(base) C:\Users\stf83wi\Desktop\Test_asc>pyinstaller --add-data 'plotly.json' ascFileReader.py
usage: pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME]
[--add-data <SRC;DEST or SRC:DEST>]
[--add-binary <SRC;DEST or SRC:DEST>] [-p DIR]
[--hidden-import MODULENAME]
[--additional-hooks-dir HOOKSPATH]
[--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES]
[--key KEY] [-d {all,imports,bootloader,noarchive}] [-s]
[--noupx] [--upx-exclude FILE] [-c] [-w]
[-i <FILE.ico or FILE.exe,ID or FILE.icns>]
[--version-file FILE] [-m <FILE or XML>] [-r RESOURCE]
[--uac-admin] [--uac-uiaccess] [--win-private-assemblies]
[--win-no-prefer-redirects]
[--osx-bundle-identifier BUNDLE_IDENTIFIER]
[--runtime-tmpdir PATH] [--bootloader-ignore-signals]
[--distpath DIR] [--workpath WORKPATH] [-y]
[--upx-dir UPX_DIR] [-a] [--clean] [--log-level LEVEL]
scriptname [scriptname ...]
pyinstaller: error: argument --add-data: invalid add_data_or_binary value: "'plotly.json'"
Laut dieser Fehlermeldung
mit
findet er die plotly.json nichtFileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\stf83wi\\AppData\\Local\\Temp\\_MEI166162\\plotly\\package_data\\templates\\plotly.json'
mit
kommt:cd C:\\Users\\stf83wi\\AppData\\Local\\Temp\\_MEI166162\\plotly\\package_data\\templates\\plotly.json
Somit dürfte die Datei fehlen?The system cannot find the path specified.
Du musst bei --add-data schon einen existierenden Pfad angeben. Die JSON-Datei wird irgendwo im plotly-Paket in deine PYTHON-INSTALLATION(!!!!) liegen. NICHT wie in der Fehlermeldung an dem Ort, an dem sie nunmal gesucht und nicht gefunden wird...
- __blackjack__
- User
- Beiträge: 14045
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Falls der Pfad überhaupt noch existiert, denn das dürfte ja das temporäre Verzeichnis sein in das die Anwendung aus der EXE entpackt wurde um sie laufen zu lassen. Das Verzeichnis sollte am Programmende – egal ob das nun ”normal” oder durch eine Ausnahme zustande gekommen ist – wieder gelöscht werden. Es sollte also ab ``Temp/`` nicht mehr weitergehen.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Ahhhhhh
Jetzt habe ich die Datei gefunden
sollte es funktionieren?
Jetzt habe ich die Datei gefunden
Und du meinst mitC:\Python37\Lib\site-packages\plotly\package_data\templates\plotly.json
Code: Alles auswählen
pyinstaller ascFileReader.py --add-data C:\Python37\Lib\site-packages\plotly\package_data\templates\plotly.json --onefile
Ja. Meine ich. Hast du das vor deiner Frage auch mal ausprobiert? Du beschleunigst damit die Kommunikation hier substantiell. Anders als du haben wir weder deinen Code noch deine Bibliotheken noch deine anderen Umgebungsaspekte hier vorliegen, und koennen das auch nur vermuten. Wir sparen uns also einmal nutzlos hin-und-her, wenn du es ausprobierst, und die Ergebnisse gleich mitlieferst.
Da bin ich voll deiner Meinung!__deets__ hat geschrieben: Mittwoch 24. Juli 2019, 14:35 Ja. Meine ich. Hast du das vor deiner Frage auch mal ausprobiert? Du beschleunigst die Kommunikation hier substantiell. Anders als du haben wir weder deinen Code noch deine Bibliotheken noch deine anderen Umgebungsaspekte hier vorliegen, und koennen das auch nur vermuten. Wir sparen uns also einmal nutzlos hin-und-her, wenn du es ausprobierst, und die Ergebnisse gleich mitlieferst.
Das ist das Ergebnis welches ich erhalte:
(base) C:\Users\stf83wi\Desktop\Test_asc>pyinstaller ascFileReader.py --add-data C:\Python37\Lib\site-packages\plotly\package_data\templates\plotly.json --onefile
usage: pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME]
[--add-data <SRC;DEST or SRC:DEST>]
[--add-binary <SRC;DEST or SRC:DEST>] [-p DIR]
[--hidden-import MODULENAME]
[--additional-hooks-dir HOOKSPATH]
[--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES]
[--key KEY] [-d {all,imports,bootloader,noarchive}] [-s]
[--noupx] [--upx-exclude FILE] [-c] [-w]
[-i <FILE.ico or FILE.exe,ID or FILE.icns>]
[--version-file FILE] [-m <FILE or XML>] [-r RESOURCE]
[--uac-admin] [--uac-uiaccess] [--win-private-assemblies]
[--win-no-prefer-redirects]
[--osx-bundle-identifier BUNDLE_IDENTIFIER]
[--runtime-tmpdir PATH] [--bootloader-ignore-signals]
[--distpath DIR] [--workpath WORKPATH] [-y]
[--upx-dir UPX_DIR] [-a] [--clean] [--log-level LEVEL]
scriptname [scriptname ...]
pyinstaller: error: argument --add-data: invalid add_data_or_binary value: 'C:\\Python37\\Lib\\site-packages\\plotly\\package_data\\templates\\plotly.json'
So wie es aussieht musst du die Angabe an --add-data anders formatieren. Die legt nicht nur fest, was mitgenommen wird, sondern auch, wo das dann plaziert wird. Dazu verwendet Pyinstaller die Syntax
--add-data "<pfad>:<destination>
wie in https://pyinstaller.readthedocs.io/en/s ... data-files beschrieben.
"""
The first string specifies the file or files as they are in this system now.
The second specifies the name of the folder to contain the files at run-time.
"""
Du musst also wahrscheinlich
--add-data "C:\Python37\Lib\site-packages\plotly\package_data\templates\plotly.json:plotly\package_data\templates"
benutzen.
--add-data "<pfad>:<destination>
wie in https://pyinstaller.readthedocs.io/en/s ... data-files beschrieben.
"""
The first string specifies the file or files as they are in this system now.
The second specifies the name of the folder to contain the files at run-time.
"""
Du musst also wahrscheinlich
--add-data "C:\Python37\Lib\site-packages\plotly\package_data\templates\plotly.json:plotly\package_data\templates"
benutzen.
Da bekomme ich folgende Fehlermeldung:
funktioniert es
Aber mit:(base) C:\Users\stf83wi\Desktop\Test_asc>pyinstaller ascFileReader_V2.5.py --add-data "C:\Python37\Lib\site-packages\plotly\package_data\templates\plotly.json:plotly\package_data\templates" --onefile
usage: pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME]
[--add-data <SRC;DEST or SRC:DEST>]
[--add-binary <SRC;DEST or SRC:DEST>] [-p DIR]
[--hidden-import MODULENAME]
[--additional-hooks-dir HOOKSPATH]
[--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES]
[--key KEY] [-d {all,imports,bootloader,noarchive}] [-s]
[--noupx] [--upx-exclude FILE] [-c] [-w]
[-i <FILE.ico or FILE.exe,ID or FILE.icns>]
[--version-file FILE] [-m <FILE or XML>] [-r RESOURCE]
[--uac-admin] [--uac-uiaccess] [--win-private-assemblies]
[--win-no-prefer-redirects]
[--osx-bundle-identifier BUNDLE_IDENTIFIER]
[--runtime-tmpdir PATH] [--bootloader-ignore-signals]
[--distpath DIR] [--workpath WORKPATH] [-y]
[--upx-dir UPX_DIR] [-a] [--clean] [--log-level LEVEL]
scriptname [scriptname ...]
pyinstaller: error: argument --add-data: invalid add_data_or_binary value: 'C:\\Python37\\Lib\\site-packages\\plotly\\package_data\\templates\\plotly.json:plotly\\package_data\\templates'
Code: Alles auswählen
pyinstaller ascFileReader_V2.5.py --add-data "C:\Python37\Lib\site-packages\plotly\package_data\templates\plotly.json;plotly\package_data\templates" --onefile
Zuletzt geändert von JohannX am Mittwoch 24. Juli 2019, 15:00, insgesamt 1-mal geändert.