Programm läuft in Python IDLE aber nicht in der Konsole

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.
Antworten
memory
User
Beiträge: 2
Registriert: Dienstag 25. Februar 2020, 07:10

Hallo,

ich beschäftige mich seit kurzem mit Python. Habe mich in die Grundlagen eingelesen und versuche das erlernte auch praktisch Umzusetzen um es zu festigen.

Ich bin mit Windows 10 und Python 3.8.2 unterwegs und habe ein Programm geschrieben, dass aus einer Protolldatei einer Umwälzpumpe die aktuellen Laufzeitstunden ausgeben soll.

Die Umwälzpumpe speichert in einer .txt Datei unter anderem die aktuelle Laufzeit in Sekunden. Jeden Tag wird eine neue Datei angelegt. Im Dateinamen ändert sich lediglich das Datum.

Also habe ich folgendes Programm geschrieben:

Code: Alles auswählen

import datetime

now =datetime.date.today()
datum = now.strftime('%d.%m.%Y')

f = open('Pumpe' + (datum) + '.txt','r')
liste = f.readlines()
f.close()

Sekunden = int(liste.pop() [61:68])
print(Sekunden)
Stunden = Sekunden / 3600
print("Laufzeit Umwälzpumpe: ")
print(format (Stunden, '.2f'))


input("press return")

Wenn ich dieses in der Python IDLE starte, gibt mir das Programm auch das aus was ich möchte.
Also das Programm LÄUFT.

Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>>
=========== RESTART: C:/Users/nchristo/Documents/Dokumente/py/Test.py ==========
3300123
Laufzeit Umwälzpumpe:
916.70
press return



Wenn ich nun das Programm über die Konsole öffnen möchte, oder per Doppelklick auf die Datei, öffnet es kurz und schließt sich gleich wieder. Okay, also habe ich am Ende den Befehl input("press return") eingefügt um das Konsolenfenster geöffnet zu lassen.

Aber irgendwie funktioniert das nicht, kann mir jemand erklären was ich falsch mache???
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@memory: Öffne eine Konsole und starte das Programm dort, also nicht per Doppelklick. Dann geht das Fenster auch nicht wieder zu und Du siehst die Fehlermeldung. Das sollte man mit Konsolenprogrammen grundsätzlich so machen — sie in der Konsole starten. Dann braucht man auch nicht Hacks wie ein `input()` am Ende, was ja nur funktioniert wenn das Programm fehlerfrei bis zu dieser Zeile kommt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ich vermute ja mal, dass die Datei, die gelesen werden soll, nicht gefunden werden kann. Da keine Pfadangabe vorhanden ist wird die Datei im aktuellen Arbeitsverzeichnis gesucht und das muss nicht mit dem Verzeichnis des Python-Skripts identisch sein.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Allgemeine Anmerkungen:

Datein öffnet man mit with, dann spart man sich das "manuelle" schließen.

Also statt:

Code: Alles auswählen

f = open('Pumpe' + (datum) + '.txt','r')
liste = f.readlines()
f.close()
besser:

Code: Alles auswählen

with open(f'Pumpe{datum}.txt','r') as f:
    liste = f.readlines()
Variablen werden laut Konvention klein_mit_unterstrich geschrieben, Außnahmen sind Klassen (MixedCase) und Konstanten (KOMPLETT_GROSS). Auch die Namen sollten eindeutiger sein und keine Dateitypen enthalten, also "liste" ist kein guter Name.

String setzt man am besten mit f-Strings zusammen.

Also statt:

Code: Alles auswählen

print(format (Stunden, '.2f'))
besser:

Code: Alles auswählen

print(f"{stunden:.2f}")
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@memory: Anmerkungen zum Quelltext:

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Das ist bei dieser handvoll Zeilen noch nicht ganz so wichtig, aber wenn man es von Anfang an richtig macht, braucht man das nicht mehr ändern wenn das Programm wächst und Funktionen dazukommen und man die dann zur Fehlersuche mal interaktiv testen möchte, oder Unit Tests schreiben möchte, oder das ganze mal dokumentieren möchte, oder Teile mit `multiprocessing` paralellisieren möchte, oder…

Zeichenketten und Werte mit ``+`` zusammensetzen ist eher BASIC als Python. In Python verwendet man die `format()`-Methode auf Zeichenketten und/oder f-Zeichenkettenliterale. Die Klammern um `datum` wären an der Stelle überflüssig.

Falls Du das Namensschema der Dateien unter Kontrolle hast, solltest Du das ändern auf "%Y-%m-%d", also von den höchstwertigen Komponenten absteigend. Denn dann entspricht eine lexikografische Sortierung der Dateinamen gleichzeitig der zeitlichen Reihenfolge.

Namen sollte man nicht abkürzen, schon gar nicht mit nur einem Buchstaben. Es gibt Ausnahmen, beispielsweise `i`, `j`, `k` für Indexwerte oder `x`, `y`, `z` für Koordinaten, oder auch wenn der Namen nur in einem sehr begrenzten Sichtbarkeitsbereich existiert wie in „comprehensions“ oder Argumente bei ``lambda``-Ausdrücken. Aber wenn man `file` meint, sollte man nicht nur `f` schreiben.

Dateien sollte man wo möglich mit der ``with``-Anweisung zusammen verwenden.

Bei Textdateien sollte man immer explizit eine Kodierung beim öffnen angeben, damit das nicht vom System und dessen Einstellungen abhängig ist.

Grundatentypen haben in Namen nichts zu suchen. Das ändert sich im Laufe der Programmentwicklung gerne mal und dann hat man entweder falsche, irreführende Namen im Code oder man muss alle betroffenen Namen anpassen. Nur der Grundatentyp ist in der Regel auch kein guter Name, denn man will bei `liste` ja eigentlich gar nicht wissen das es eine Liste ist, sondern was der Inhalt bedeutet. In diesem Fall beispielsweise: `zeilen`.

`pop()` ist hier eine ineffiziente Methode wenn man einfach nur das erste Element der Liste haben möchte. Da greift man einfach mit ``liste[0]`` drauf zu. `pop()` liefert nicht nur dieses Element sondern entfernt es auch aus der Liste wobei alle volgenden Elemente um eine Position nach vorne verschoben werden müssen.

Wenn man sowieso nur die erste Zeile braucht, dann macht es aber auch wenig Sinn alle einzulesen, statt eben einfach nur die erste Zeile zu lesen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Siehe auch den Style Guide for Python Code.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from datetime import date as Date


def main():
    filename = f"Pumpe{Date.today():%d.%m.%Y}.txt"
    with open(filename, "r", encoding="utf-8") as file:
        line = next(file)

    sekunden = int(line[61:68])
    print(sekunden)
    stunden = sekunden / 3600
    print(f"Laufzeit Umwälzpumpe: {stunden:.2f}h")


if __name__ == "__main__":
    main()
Der Code enthält keinerlei Fehlerbehandlung. Was soll passieren wenn die Datei nicht existiert? Was wenn sie existiert aber leer ist? Was wenn sie existiert, mindestens eine Zeile enthält, aber der Teil vom 62. bis zum 68. Zeichen nicht in eine ganze Zahl umgewandelt werden kann?

Einer dieser Fälle ist wahrscheinlich der Grund warum das nicht läuft. Ich tippe auf den ersten Fall. Die Datei wird im aktuellen Arbeitsverzeichnis gesucht. Das ist wahrscheinlich nicht das was Du denkst was es ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
memory
User
Beiträge: 2
Registriert: Dienstag 25. Februar 2020, 07:10

Guten Morgen,
und danke für die schnellen Antworten, entschuldigt das meine Antwort Geschwindigkeit zu wünschen übrig lässt.
__blackjack__ hat geschrieben: Freitag 6. März 2020, 08:30 @memory: Öffne eine Konsole und starte das Programm dort, also nicht per Doppelklick. Dann geht das Fenster auch nicht wieder zu und Du siehst die Fehlermeldung. Das sollte man mit Konsolenprogrammen grundsätzlich so machen — sie in der Konsole starten. Dann braucht man auch nicht Hacks wie ein `input()` am Ende, was ja nur funktioniert wenn das Programm fehlerfrei bis zu dieser Zeile kommt.
@__blackjack__ ich hatte dieses ja schon versucht in der Konsole von Windows zu öffnen. Auch da hatte ich das gleiche Problem, eine Fehlermeldung wurde nicht ausgegeben. Das war ja auch das was mich irritiert hat, da überall wo ich mich eingelesen habe stand, das ein Fehler ausgegeben wird.
/me hat geschrieben: Freitag 6. März 2020, 08:38 Ich vermute ja mal, dass die Datei, die gelesen werden soll, nicht gefunden werden kann. Da keine Pfadangabe vorhanden ist wird die Datei im aktuellen Arbeitsverzeichnis gesucht und das muss nicht mit dem Verzeichnis des Python-Skripts identisch sein.


@/me danke das war der richtige Tipp. Obwohl ich meinen Fehler da nicht ganz so nachvollziehen kann. Da auch nach meinen Wissensstand, wie du beschrieben hast, im aktuellen Arbeitsverzeichnis gesucht wird. Das war bei mir der Fall das ich im gleichen Arbeitsverzeichnis gearbeitet habe. Nach Angabe des kompletten Pfads läuft die Sache jetzt.



@Jankie und __blackjack__ wie gesagt, ich stehe am Anfang und wie sagt man aller Anfang ist schwer. Ich versuche mal eure Tipps umzusetzen. Danke für deine sehr ausführlichen Anmerkungen __backjack__ ich versuche in Zukunft den Style Guide for Python Code gerecht zu werden. Aber gerade wenn man am Anfang steht, ist es nicht so einfach an alles zu denken oder alles zu berücksichtigen. Man freut sich wenn was lauffähiges dabei heraus kommt. Man macht einen Schritt nach dem anderen, mit der Zeit lernt man das denke ich und gerade auch von den eigenen Fehlern.

Ich wünsche euch noch eine schöne Woche.
Antworten