Seite 1 von 2

auf datei warten und kontrollieren ob sie nicht mehr wächst

Verfasst: Dienstag 16. Juni 2009, 01:30
von max793
Hallo zuammen

ich würde mich frage ob mein Programm so funktioniert.
Es soll als erstes kontrollieren ob die datei vorhanden ist. ist diese Bedingung erfühlt, muss das Progamm immer wieder schauen ob die datei angewachsen ist. wenn nun die datei gleich bleibt so sich das Programm schließen.

Code: Alles auswählen


import os 
import time 
import os.path
file = "C:/user/.../test.req"


while not  os.path.exists(datei):
    time.sleep(20)
	
size1 = os.path.getsize(file)
size2 = 0
if size1 >= size2:
	size1 = size2
	size1 = os.path.getsize(file)
       time.sleep(20)
else
	time.sleep(1)
	break

print "die Berechnung ist zu ende" 

danke!

Verfasst: Dienstag 16. Juni 2009, 06:40
von Hyperion
Wenn ich das so alles richtig aus Deiner Anfrage interpoliert habe, brauchst Du eine while-Schleife vor Zeile 14. Diese darf eben nur verlassen werden, wenn die Größe der Datei sich nicht innerhalb eines Schleifendurchlaufs geändert hat.

Generell:

- Code auf Modulebene ist selten optimal
- Du musst nicht os importieren, wenn Du nichts aus diesem Modul nutzt. os.path kannst Du auch unabhängig davon importieren.
- size1 und size2 sind keine guten Bezeichner ... wie wäre es mit old_size und new_size? Damit kann man sofort etwas assoziieren.

Verfasst: Dienstag 16. Juni 2009, 07:54
von cofi
Dazu kommt, dass du ``file`` nicht verwenden solltest, in Zeile 9 einen ``NameError`` bekommst und dein Vergleichsoperator falsch ist (zumindest widerspricht er deiner Beschreibung).

Aber wenn ich das richtig interpretiere, willst du doch wissen, ob ein Prozess noch arbeitet bzw wann er fertig ist?
Wäre es nicht besser zu überprüfen, ob der Prozess tatsächlich noch läuft? Oder ist es möglich den laufenden Prozess so zu modifizieren, dass er Bescheid gibt, wenn er fertig ist (XML-RPC/Konsorten, Flag-Dateien, ...) ? Dein Ansatz ist nämlich ziemlich fragil, wie genau Windows (bzw FAT/NTFS) bei der Verwaltung der Daten vorgeht kann ich zwar nicht sagen, aber dein Ansatz baut darauf auf, dass die Daten zeitnah auf der Platte landen bzw die Verwaltung das vorgaukelt. Sieht für mich extrem wackelig aus ;)

edit: Ha! und der ``SyntaxError`` in Zeile 18 ;)

Verfasst: Dienstag 16. Juni 2009, 08:01
von max793
Hallo

ich nun diese Aufgabe noch mit den vorhandenen Tips überarbeitet und frage euch nun ob das so klappen kann!

Code: Alles auswählen


import time 
import os.path 

file = "C:/user/.../test.req" 



while not os.path.exists(datei): 
    time.sleep(20) 
    
    
    
    
sizenew = os.path.getsize(file) 
sizeold = 0 

while sizenew > sizeold:
        sizeold = sizenew 
        sizenew = os.path.getsize(file) 
        time.sleep(20)        
        
        
time.sleep(5)

print "die Berechnung ist zu ende" 

Danke

Verfasst: Dienstag 16. Juni 2009, 08:05
von cofi
Der ``NameError`` in Zeile 9 ist immernoch da. Daneben bleibt nur ausprobieren - und die Leerzeichen zu entfernen, is ja fürchterlich.

Aber wie gesagt: Das Problem ist das Konzept. Kann man da nicht dran arbeiten?

Verfasst: Dienstag 16. Juni 2009, 08:12
von BlackJack
@max793: Es kann am Anfang einen Zeitraum geben, in dem die Datei existiert, aber 0 Bytes gross ist. Dann verlässt Du an der Stelle schon die ``while``-Schleife.

Möchte mich auch noch mal den Warnern anschliessen: Das ist fragil!

Verfasst: Dienstag 16. Juni 2009, 08:18
von Dill
morgen,


du hattest doch weiter unten schonmal eine frage zu ereignissen im dateisystem. hat das nicht weitergeholfen?

Verfasst: Dienstag 16. Juni 2009, 08:40
von max793
Hallo ich habe nun das Programm nochmals überarbeitet, denn es waren ein paar schlampigkeitsfehler drin.

jetzt schaut das ganze so aus:

Code: Alles auswählen


import time
import os.path

file = "C:\optadams/acar.log"



while not os.path.exists(file):
    time.sleep(20)




sizenew = os.path.getsize(file)
sizeold = 0.1

while sizenew > sizeold:
        sizeold = sizenew
        sizenew = os.path.getsize(file)
        time.sleep(20)


time.sleep(5)

print "die Berechnung ist zu ende"
ich dachte das hat große auswirkungen wenn am anfang die Dateigröße 0 ist da es ja nur ein rechenwert ist! Aber ich kann ihn ja sehr niedrieg ansetzen

Weiters danke! es hat mir natürlich weitergeholfen nun hier kann ich das nicht vorher wo ausprobieren weil ich keine Datei habe die sich immer vergrößert. Deshalb habe ich das Problem nochmals euch nähergebracht um zu fragen was ihr dazu sagt.

Danke

Verfasst: Dienstag 16. Juni 2009, 08:46
von Dill
das bringt nix. überleg doch mal...

sizeold = -1


in welchem rahmen willst du das denn einsetzten?
was willst du damit erreichen?
es gibt sicher eine besere, solidere lösung.

Verfasst: Dienstag 16. Juni 2009, 08:58
von max793
bei mir ist das so: ich bekomme aus einem Programm eine Datei heraus die sich in 10- 20 sek. abständen vergrößert. und python soll nun kontrolieren wann die datei aufhört sich zu vergrößern, wenn das eingetreten ist, soll sich das programm schließen! das ist der sinn der sache! Ich kann die größe auf 5 auch setzten ist siche kein Problem den die Datei wird sicher immer 500 kB groß das weiß ich!

Verfasst: Dienstag 16. Juni 2009, 09:03
von Dill
aber es ist nicht problematisch, wenn das mal nicht funktioniert?
Ich kann die größe auf 5 auch setzten ist siche kein Problem...
und was passiert dann in zeile 19?

Verfasst: Dienstag 16. Juni 2009, 09:08
von max793
Das sehe ich anders- wenn die datei existiert kann ich ja noch mal ein paar sek. warten -denn díe berechnung dauert ja sicher länger -so ist die Datei dann sicher größer!

was ich noch gerne mal wissen würde, schreibt man bei solchen programmen schon diese mit Funktionen aus --> wenn man schon genug erfahrung hat?

Verfasst: Dienstag 16. Juni 2009, 09:14
von Dill
max793 hat geschrieben:Das sehe ich anders- wenn die datei existiert kann ich ja noch mal ein paar sek. warten -denn díe berechnung dauert ja sicher länger -so ist die Datei dann sicher größer!
das kann ja sein, dass das meistens gut geht. ist aber umständlich, unsicher, unschön. warum nicht einfach:

Code: Alles auswählen

sizeold = -1 

Verfasst: Dienstag 16. Juni 2009, 09:22
von max793
sehr guter tipp - eine negative Zahl - eigentlich genial!

Danke!

Verfasst: Dienstag 16. Juni 2009, 09:24
von Dill
:oops:

Verfasst: Dienstag 16. Juni 2009, 09:42
von cofi
max793 hat geschrieben:was ich noch gerne mal wissen würde, schreibt man bei solchen programmen schon diese mit Funktionen aus --> wenn man schon genug erfahrung hat?
Was meinst du? Dass du das ordentlich in eine Funktion schreibst und im Falle einer direkten Ausführung startest? Ja, das macht man normalerweise, aber wie gesagt: Das ist dein kleinstes Problem.

Btw: Ich finde es ja schön das du deinen Code konstant englisch schreibst, aber fällt dir denn immernoch nicht auf, dass ``file`` so eine gesunde Farbe hat?
Für deinen Dateipfad solltest du dich entweder für Slashes oder Backslashes entscheiden und kommen letztere drin vor, solltest du deine Literale als ``raw`` kennzeichnen.

Verfasst: Dienstag 16. Juni 2009, 10:22
von frabron
Sollte man dafür nicht os.path.join nehmen? Da wird doch automatisch der richtige Separator os.sep genommen.

Verfasst: Dienstag 16. Juni 2009, 12:19
von cofi
Jein. Wenn du einen festen Pfad angibst, ist der eh an eine Plattform, wenn nicht sogar eine Maschine gebunden. Insofern macht man die Konfigurationseinstellung nur schlecht lesbar und man sieht nicht auf den ersten Blick was es überhaupt ist. Aber im Prinzip hast du natürlich Recht.

Verfasst: Dienstag 16. Juni 2009, 13:51
von frabron
Auch wieder war. Man würde aber noch zusätzlich gleich die Steuerzeichenproblematik unter Windows umgehen (\n, \t, ...) wenn man os.path.join nimmt. Man kann natürlich auch escapen ...

Verfasst: Dienstag 16. Juni 2009, 13:55
von Dill
oder man nutzt r"c:\raw\strings"