shutil.copy ohne Funktion

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
Zeusdragoon
User
Beiträge: 5
Registriert: Montag 12. Februar 2024, 10:59

Guten Tag,
ich habe seit fast einem Jahr eine Python Programm zur Aufzeichnung meiner Heizungstemperaturen am laufen.
Seit Anfang des Monats läuft es nicht mehr, da keine Tages Logs mehr angelegt werden.
shutil.copy gibt auch kein Fehler aus, erst das Fehlen der Datei löst einen Load Error aus.

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/zeusdragoon/Heizung4a_Test.py", line 85, in <module>
    wb_log = load_workbook(pfad+Datei)
             ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/openpyxl/reader/excel.py", line 315, in load_workbook
    reader = ExcelReader(filename, read_only, keep_vba,
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/openpyxl/reader/excel.py", line 124, in __init__
    self.archive = _validate_archive(fn)
                   ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/openpyxl/reader/excel.py", line 96, in _validate_archive
    archive = ZipFile(filename, 'r')
              ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/zipfile.py", line 1281, in __init__
    self.fp = io.open(file, filemode)
              ^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/home/zeusdragoon/240428_Log.xlsx'
Ich habe die betreffenden Zeilen aus dem Programm zusammengefast. Komischer weise läuft es damit.

Code: Alles auswählen

import shutil
from datetime import datetime

current_time = datetime.now()
time_stamp = current_time.timestamp()
date_time = datetime.fromtimestamp(time_stamp)
Datei=date_time.strftime("%Y%m%d")[2:]+str("_Log.xlsx")

pfad='/home/zeusdragoon/'

shutil.copy(pfad + "Master_Log.xlsx", pfad + Datei)
Ausgeführt wird es als Root und die verwendeten Dateien sind identisch mit dem Original Programm.

Für einen Hinweis wo ich noch suchen kann wäre ich sehr dankbar.
Gruß Markus
Sirius3
User
Beiträge: 17779
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn das Programm läuft, dann muss der Fehler woanders liegen. Z.b. beim Aufruf des Programms oder noch früher.
Wie werden die Programme aufgerufen? Wie werden Fehler protokolliert? Was für Meldungen tauchen in den Protokollen auf?

Das Kopierprogramm an sich ist gruselig. Als erstes wird das aktuelle Datum in ein timestamp umgewandelt und gleich danach wieder zurück. Den Schritt könnte man also einfach weglassen. Dann werden Strings munter per + zu Pfaden zusammengebaut, anstatt man f-Strings und pathlib benutzt. Für zweistellige Jahreszahlen gibt es %y.

Code: Alles auswählen

import shutil
from datetime import datetime
from pathlib import Path
MASTER_LOG =Path("/home/zeusdragoon/Master_Log.xlsx")

current_time = datetime.now()
target_path = MASTER_LOG.parent / f"{current_time:%y%m%d}_Log.xlsx"
shutil.copy(MASTER_LOG, target_path)
Benutzeravatar
__blackjack__
User
Beiträge: 13161
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Zeusdragoon: Randbemerkung: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). Also `datei` statt `Datei`. Wobei der Namen inhaltlich falsch ist. Das ist ja gar kein Datei-Objekt mit `read()` oder `write()` und `close()` Methoden, sondern ein Datei*name*. Und dann wäre es auch sinnvoll sich bei den Namen auf eine Sprache zu beschränken und nicht Englisch und Deutsch zu mischen.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Zeusdragoon
User
Beiträge: 5
Registriert: Montag 12. Februar 2024, 10:59

Wie man merkt bin ich nicht vom Fach.
Mein Programm ist ehre eine aneinander Reihung von Google Ergebnissen.
Lief aber bis vor kurzen, trotzdem kann ich nachvollziehen das sich euch die Nackenhaare aufstellen.
Ich bitte um Nachsicht.

@Sirius3
Das Programm läuft auf einem Pi Zero mit Debian 12 Bookworm
Ich starte das Programm im Autostart über /etc/rc.local
/usr/bin/python3 /home/zeusdragoon/Heizung4.py

Ansonsten zum testen über die Konsole per SSH Verbindung
Wie werden Fehler protokolliert?
ich meine gar nicht
Was für Meldungen tauchen in den Protokollen auf
wie kann man das ansehen?
Bis jetzt habe ich mir nur die Ausgabe in der Konsole angesehen.

vielen Dank für das verbessern meiner Codes
Sirius3
User
Beiträge: 17779
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie ich gerade gelesen habe ist /etc/rc.local seit 1983 veraltet.
Auch Du solltest auf systemd umsteigen. Eine systemd-Unit zu schreiben ist mit den vielen Beispielen im Netz auch nicht allzu schwierig. Vorteil: Du bekommst das Protokoll zur Fehlersuche gleich mit.
oldboyJR
User
Beiträge: 35
Registriert: Donnerstag 28. März 2024, 16:19

PS: wer hat was geupdatet? Die Heizung ein neues Betriebsystem dein Laptop/tablet ein Autoupdate? Solche updates vertragen sich häufig nicht oder schränken ein. Klassisch ist zum Beispiel der Fernseher!! Hat man nicht sofort ein Backup vom ersten System erstellt und kann es darüber nicht wieder herstellen hat man die A.... Karte Apps und manche Einstellungen verschwinden einfach und synchronisationen funktionieren unwiederruflich nicht. Hat dein Laptop ein Autoupdate sollte man versuchen erst das System zu sichern und dann das alte wieder herstellen. Oder deine AbfrageUmgebung ist neu (neues Python) und die Syntax ist neuer. Dein post zeigt nicht die richtige Einstellungen sondern eine allgemeine Formulierung!! Richtig währe anstatt "filename" "filename.csv" oder "filename.xls", und so etwas wie "r" für read only. (versehendlich deinen ersten Versuch aufgerufen bzw die Bearbeitung nicht abgespeichert?)
Benutzeravatar
__blackjack__
User
Beiträge: 13161
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@oldboyJR: Wie kommst Du denn jetzt auf Updates? Und welcher Laptop? Es geht hier um keinen Laptop. Und was hat Dein Fernseher damit zu tun?

Bei einem Syntaxfehler würde das Programm gar nicht erst starten. Es läuft ja aber, nur eine bestimmte Aktion wird nicht ausgeführt.

Das mit dem Dateinamen ist auch nicht nachvollziehbar. Im Traceback kommt `filename` vor, aber nicht in dem Quelltext von Zeusdragoon sondern in einer verwendeten Bibliothek, und dort ist das auch korrekt als *Variablenname*. Das ist ja nicht der literale Dateiname an der Stelle.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Benutzeravatar
Dennis89
User
Beiträge: 1181
Registriert: Freitag 11. Dezember 2020, 15:13

__blackjack__ hat geschrieben: Mittwoch 1. Mai 2024, 17:19 Und was hat Dein Fernseher damit zu tun?
Ich weis gar nicht was du hast, da seit dem 1. April alles etwas entspannter in Deutschland geworden ist, sind mir solche Zusammenhänge plötzlich vollkommen klar, auch Nelli mein grüner Elefant versteht das.


SCNR! :mrgreen:
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten