Fritzbox NAS Verbindungsprobleme Laufzeit os.path.exists

  • Hallo Community,


    ich bin nun seit längerem auf Fehlersuche in meinem Programm.

    Leider komme ich nicht weiter.

    Zum Hintergrund: Ich versuche Dateien auf die Nas an einer Fritzbox zu schreiben. Nun kam es hier immer wieder zu kleineren Verbindungsproblemen, weshalb sich mein Programm ca. 1 Minute lang aufhängt und versucht den Ordner zu finden. Ergebnis ist, dass es danach erst abbricht und nichts mehr macht.

    import os,sys


    Der Versuchscode lautet wie folgt:


    (ich hoffe ich habe keine Kopierfehler gemacht....)


    Ich habe bereits folgende Überprüfungsvarianten versucht:

    os.path.exists

    os.path.isdir

    os.access (...,os.X_OK)

    os.access (...,os.F_OK)

    os.path.isfile


    Ich habe mit abgelegten Dateien in Unterordnern gearbeitet etc.


    Problematisch ist immer, dass bei einer Unterbrechung der Netzwerkverbindung das Programm sehr lange "steht". Mein nächster Ansatz wäre, dass die IF-Abfrage vielleicht nur eine gewisse Zeit versuchen darf, auf den Ordner zuzugreifen, wenn das nicht klappt, dann ist der Wert automatisch False.


    Oder hat vielleicht noch jemand eine Lösung für mich?


    Ich hoffe, dass meine Problembeschreibung auch für Außenstehende klar ist.


    Danke schonmal für die Hilfe.


    Viele Grüße


    P.S.: Achja ich teste das gerade, indem ich die Firtzbox erst angehängt lasse (da klappt alles gut in wenigen Millisekunden), danach ziehe einfach den Stecker der Fritzbox und teste wieder (dauert dann ca. 1 Minute)

  • Hallo,


    das mit der Abbruchbedingung kann man zeitbasiert machen, ist ja auch nicht schwierig zu implementieren. Also: mach mal :)


    Die Verwendung von globalen Variablen ist in 99,9% der Fälle falsch und in deinem Code auch noch ziemlich sinnlos. `naspathexists` ist für das Ausführen der Funktion irrelevant. Und deine Funktion sollte einfach `True` oder `False` zurück geben, das Ergebnis bindest du an `naspathexists` -> fertig. Und das `global` ist eliminiert.


    Gruß, noisefloor

  • Hallo noisefloor,


    ja das mit den globalen Variablen weiß/habe ich schon mehrmals gehört ich. In meinem Hauptprogramm, wird die jedoch zwingend gebraucht (zumindest aus meiner Sicht), weil ich in den Exceptions wissen muss, wo genau das Programm ausgestiegen ist, damit ich das Programm an der richtigen Stelle wieder einsteigen lassen kann. ;)


    Habe hier nur mal den relavanten und definitiv fehlerbehafteten Code als Testprogramm laufen und hier reinkopiert.


    Zeitliche Implementierung wäre kein Problem mit der datetime-Abfrage, wenn er nicht bereits in der If-Abfrage hängen würde. Sprich das Programm prüft solange ob der Pfad existiert/accessable ist und gibt erst danach den Wert True oder False aus. Während der Abfrage kann ich ja nicht mehrmals die verstrichen Zeit abfragen, außer Multithreading, oder doch?


    Bist du der Meinung, dass ich das mit einem Muli-Thread machen muss? Wenn ja, dann habe ich dabei sehr wenig Erfahrung und weiß leider nicht, wie ich dann die If-Abfrage aus einem anderen Thread abbrechen kann.


    Danke für die Hilfe.


    Viele Grüße

  • Warum wertest Du die Bedinging nur auf true aus ?

    Für mich würde sich anbieten, das NAS vorerst einfach zu mounten, wenn der nas.path fehlt.


    Servus !

    RTFM = Read The Factory Manual, oder so

  • Hallo,


    Quote

    In meinem Hauptprogramm, wird die jedoch zwingend gebraucht (zumindest aus meiner Sicht),

    Sprich stark für einen Entwurfsfehler bzw. das du nicht konsequent Funktionen, Rückgabewerte oder eine Klasse verwendest.

    Grundsätzlich: `global` macht den Zustand eines Programms unübersichtlich bis nicht nachvollziehbar und ist in 99,9% der Fälle falsch.


    Bzgl. der Zeit: du kannst Schleifen verschachteln oder mehrere Bedingungen prüfen. Wie willst du das den per Threading lösen? Dann muss der eine Thread doch mit dem anderen Kommunizieren. Geht, macht die Sache aber mal definitiv nicht


    Wie wäre denn mit so was wie:


    Python
    >>> from time import sleep
    >>> from datetime import datetime
    >>> def foo():
    ...     start = datetime.now()
    ...     while (datetime.now() - start).seconds < 10:
    ...         print('do something')
    ...         sleep(1.5)
    ...     print('Timeout after 10 seconds!')
    ...
    >>>

    Gruß, noisefloor

  • Hallo community,


    zunächst kurze Info von meiner Seite:


    Das Laufwerk wird mit dem Boot gemountet. Problematisch ist eine Unterbrechung zum Laufwerk während der Raspberry läuft.


    Das Problem mit der while-Schleife lässt sich leider nicht lösen. Hatte es mit einem eigenen Thread gemacht, welcher dann erzwungenermaßen eine Exception aufgerufen hat. Von dort konnte ich das Programm geregelt weiterlaufen lassen. Hat zunächst alles funktioniert, dann kam aber wieder das gleiche Problem. Konnte das Problem dann reproduzieren gehe davon aus, dass das Problem somit nicht in Python sondern beim Betriebssystem liegt. Wenn das Laufwerk gemountet ist und dann die Verbindung wegbricht (oder das Laufwerk), dann sucht anscheinend das System sich zunächst einen Wolf, weil es anscheinend denkt, dass das Laufwerk noch da ist.


    Lange Rede kurzer Sinn:

    Ich habe es nach längerem hin und her nun mit Samba anderweitig umgesetzt. Beim Sambaordner habe ich keine Unterbrechungen und der andere Rechner greift dennoch auf das Laufwerk zu, auch wenn das Netzwerk mal ausgefallen ist.


    Vielen Dank für Eure Hilfe.


    noisefloor: Ich bin weder ein gelernter Programmierer, noch bin ich wirklich sehr gut. Ich weiß, dass mein Programm sehr unübersichtlich ist, aber es erfüllt seinen Zweck voll und ganz. Vielleicht schaffe ich es irgendwann mal das ganze mit Rückgabewerten und Klassen neu zu schreiben.


    Danke für die Hilfen. Ich versuche das nächste mal mein Problem noch besser zu beschreiben, und ich hoffe, dass mein Code dann auch etwas besser ist ;)


    Für mich ist das Problem somit gelöst und kann geschlossen werden.