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.
Benutzeravatar
snafu
User
Beiträge: 6866
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

... 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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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!
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

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))
 
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

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.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Jankie 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.
Habs jetzt Berücksichtigt

Code: Alles auswählen

# Speicherort wählen
        self.file2 = QFileDialog.getExistingDirectory()
        # Zeigt den Pfad an wo gespeichert wird
        self.ui.Info2.setText(self.file2)
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

So nun zu meinem eigentlichen Problem. :x
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
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\stf83wi\\AppData\\Local\\Temp\\_MEI37762\\plotly\\package_data\\templates\\plotly.json'
plotly habe ich mit

Code: Alles auswählen

pip install plotly
installiert
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Kannst du bitte mal den ganzen Code mit den </> Code-Tags posten?
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

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_())
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

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.
Es gibt eine kleine Dokumentation darüber, aber soweit nichts brauchbares!
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
eventuell mit:

Code: Alles auswählen

pyinstaller --add-data 'src/plotly.json' ascFileReader.py
Aber selbst da kommt die Meldung:
(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'"
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Laut dieser Fehlermeldung
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\stf83wi\\AppData\\Local\\Temp\\_MEI166162\\plotly\\package_data\\templates\\plotly.json'
findet er die plotly.json nicht

mit
cd C:\\Users\\stf83wi\\AppData\\Local\\Temp\\_MEI166162\\plotly\\package_data\\templates\\plotly.json
kommt:
The system cannot find the path specified.
Somit dürfte die Datei fehlen?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Man wechselt mit "cd" in ein Verzeichnis (change directory). Zumindest unter allen mir bekannten Betriebssystemen.
Das mit einer Datei als Argument aufzurufen, macht keinen Sinn.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Wennst am Ende plotly.json weglässt solltest du in das Verzeichnis kommen, zumindest ist es bei ubuntu, MacOS und Windows 10 so
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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...
Benutzeravatar
__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.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Ahhhhhh
Jetzt habe ich die Datei gefunden
C:\Python37\Lib\site-packages\plotly\package_data\templates\plotly.json
Und du meinst mit

Code: Alles auswählen

pyinstaller ascFileReader.py --add-data C:\Python37\Lib\site-packages\plotly\package_data\templates\plotly.json --onefile
sollte es funktionieren?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

__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.
Da bin ich voll deiner Meinung!

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'
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Da bekomme ich folgende Fehlermeldung:
(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'
Aber mit:

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
funktioniert es
Zuletzt geändert von JohannX am Mittwoch 24. Juli 2019, 15:00, insgesamt 1-mal geändert.
Antworten