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

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.
max793
User
Beiträge: 58
Registriert: Montag 11. Mai 2009, 10:05

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!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 ;)
max793
User
Beiträge: 58
Registriert: Montag 11. Mai 2009, 10:05

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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?
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!
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

morgen,


du hattest doch weiter unten schonmal eine frage zu ereignissen im dateisystem. hat das nicht weitergeholfen?
http://www.kinderpornos.info
max793
User
Beiträge: 58
Registriert: Montag 11. Mai 2009, 10:05

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
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

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.
http://www.kinderpornos.info
max793
User
Beiträge: 58
Registriert: Montag 11. Mai 2009, 10:05

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!
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

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?
http://www.kinderpornos.info
max793
User
Beiträge: 58
Registriert: Montag 11. Mai 2009, 10:05

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?
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

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 
http://www.kinderpornos.info
max793
User
Beiträge: 58
Registriert: Montag 11. Mai 2009, 10:05

sehr guter tipp - eine negative Zahl - eigentlich genial!

Danke!
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

:oops:
http://www.kinderpornos.info
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Sollte man dafür nicht os.path.join nehmen? Da wird doch automatisch der richtige Separator os.sep genommen.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

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 ...
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

oder man nutzt r"c:\raw\strings"
http://www.kinderpornos.info
Antworten