In eine Textdatei laufend schreiben

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
7crystal7
User
Beiträge: 46
Registriert: Freitag 26. Mai 2006, 18:50

Hallo Leute,

ich möchte in ein Logfile schreiben, das einfach eine Textdatei sein soll.
Dabei möchte ich Zeile für Zeile anfügen, während des Zugriffs soll die Datei gelockt werden.
Wie mache ich sowas?

Danke
Babsi
cracki
User
Beiträge: 72
Registriert: Montag 25. Dezember 2006, 05:01

machs einfach.
oeffnen, reinschreiben
...meh...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

7crystal7 hat geschrieben:Dabei möchte ich Zeile für Zeile anfügen, während des Zugriffs soll die Datei gelockt werden.
Hi Babsi!

Unter Windows:

Code: Alles auswählen

f = file("J:/Ablage/xxx.txt", "a")
# Ab jetzt ist die Datei unter Windows automatisch gesperrt
f.close()
# jetzt nicht mehr.
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
7crystal7
User
Beiträge: 46
Registriert: Freitag 26. Mai 2006, 18:50

danke, das ganze läuft unter Linux.

Wird die Datei da auch automatisch gesperrt?

DAnke
Babsi
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

7crystal7 hat geschrieben:das ganze läuft unter Linux. Wird die Datei da auch automatisch gesperrt?
Hi Babsi!

Nein, aber dafür kannst du das Modul ``fcntl`` einsetzen.

http://docs.python.org/lib/module-fcntl.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
7crystal7
User
Beiträge: 46
Registriert: Freitag 26. Mai 2006, 18:50

danke, könntest Du mir ein kleines Codefragment hinschreiben bei dem das File dann gelockt wird während etwas angefügt wird.. Bin leider Newbie, das wäre sehr nett!

Danke
Babsi
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

7crystal7 hat geschrieben:das wäre sehr nett!
Hallo Babsi!

Eigentlich sollte es -- meiner Meinung nach -- so funktionieren:

Code: Alles auswählen

>>> import fcntl
>>> f = file("hallo.txt", "a")
>>> fcntl.lockf(f.fileno(), fcntl.LOCK_EX)
>>> f.write("Hallo\n")
>>> fcntl.lockf(f.fileno(), fcntl.LOCK_UN)
>>> f.close()
>>>
Allerdings konnte ich bei meinem Test trotzdem mit ``echo "Hallo" >> testdatei.txt`` von einem anderen Terminal aus etwas in die Datei schreiben -- obwohl ich vorher die Datei gesperrt hatte. Vielleicht liegt es daran, dass ich in beiden Terminals als root angemeldet war. :K

Mit ``nano -w testdatei.txt`` konnte ich keine Änderung in die Textdatei schreiben.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
7crystal7
User
Beiträge: 46
Registriert: Freitag 26. Mai 2006, 18:50

alles klar, ich probier das aus!

Vielen Dank!
BlackJack

gerold hat geschrieben:Allerdings konnte ich bei meinem Test trotzdem mit ``echo "Hallo" >> testdatei.txt`` von einem anderen Terminal aus etwas in die Datei schreiben -- obwohl ich vorher die Datei gesperrt hatte. Vielleicht liegt es daran, dass ich in beiden Terminals als root angemeldet war. :K
Die Locks sind nur freundliche Hinweise. Wenn eine Anwendung nicht fragt ob gelockt ist, dann bringts auch nichts.
Mit ``nano -w testdatei.txt`` konnte ich keine Änderung in die Textdatei schreiben.
`nano` ist dann wohl so freundlich zu fragen ob gelockt ist, bzw. lockt selbst.
7crystal7
User
Beiträge: 46
Registriert: Freitag 26. Mai 2006, 18:50

hmm ok,

zumindest sollte aber so verhindert werden das über python gleichzeitig in das File geschrieben wird (threads oder so?)?

Danke
Babsi
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

7crystal7 hat geschrieben:zumindest sollte aber so verhindert werden das über python gleichzeitig in das File geschrieben wird
Hi Babsi!

Du könntest z.B. Lockfiles dafür verwenden!

- Schau nach ob eine besondere Datei mit dem gleichen Dateinamen, aber der Endung ".lck" existiert. Prüfe nach, ob der Prozess oder Thread, der diese Datei erstellt hat noch läuft. Wenn ja --> warten. Wenn nicht --> alte Lockdatei löschen.
- Neue Lockdatei erstellen.
- Datei öffnen und in die Datei schreiben.
- Datei schließen.
- Lockdatei löschen.

PID und Namen des Threads kannst du in die Lockdatei schreiben.
Mit dem PID prüfst du, ob das Programm, das die Lockdatei erstellt hat, noch läuft.
Mit dem Threadnamen prüfst du, ob der benannte Thread noch läuft, falls es sich um das eigene Programm handelt.

mfg
Gerold
:-)

PS: ...oder du findest raus, wie du prüfen kannst, ob die Datei gesperrt ist. Ich bin da noch nicht sicher.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

``os.access``
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

gerold hat geschrieben:Du könntest z.B. Lockfiles dafür verwenden!

- Schau nach ob eine besondere Datei mit dem gleichen Dateinamen, aber der Endung ".lck" existiert. Prüfe nach, ob der Prozess oder Thread, der diese Datei erstellt hat noch läuft. Wenn ja --> warten. Wenn nicht --> alte Lockdatei löschen.
- Neue Lockdatei erstellen.
- Datei öffnen und in die Datei schreiben.
- Datei schließen.
- Lockdatei löschen.
Das funktioniert nicht zuverlässig. Prozess 1 kommt an und testet ob die Lockdatei vorhanden ist -> Nein. Prozesswechsel. Prozess 2 testet ob Lockdatei vorhanden ist -> Nein. Und schon schreiben beide in die Datei.
PS: ...oder du findest raus, wie du prüfen kannst, ob die Datei gesperrt ist. Ich bin da noch nicht sicher.
Na ganz einfach ein exlusives Lock anfordern. Das klappt natürlich nicht, wenn schon eines vergeben wurde und der Kernel garantiert das diese Aktion atomar ist.

Die `os.access()` "Lösung" hat genau das gleiche Problem, was ich oben für die Lockdatei beschrieben habe.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BlackJack hat geschrieben:Na ganz einfach ein exlusives Lock anfordern.
Hi BlackJack!

Was habe ich mit dieser Codezeile gemacht?

Code: Alles auswählen

fcntl.lockf(f.fileno(), fcntl.LOCK_EX)
Gibt es eine andere Methode, eine Datei wirklich exclusiv zu sperren?

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

cracki hat geschrieben:machs einfach.
oeffnen, reinschreiben
-->
7crystal7 hat geschrieben:während des Zugriffs soll die Datei gelockt werden.
BlackJack

gerold hat geschrieben:
BlackJack hat geschrieben:Na ganz einfach ein exlusives Lock anfordern.
Hi BlackJack!

Was habe ich mit dieser Codezeile gemacht?

Code: Alles auswählen

fcntl.lockf(f.fileno(), fcntl.LOCK_EX)
Ein exklusives Lock angefordert.
Gibt es eine andere Methode, eine Datei wirklich exclusiv zu sperren?
Nein.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

@BlackJack:
Jetzt komme ich aber nicht mit (Drehen uns im Kreis):
Einerseits sagst du "Die Locks sind nur freundliche Hinweise. Wenn eine Anwendung nicht fragt ob gelockt ist, dann bringts auch nichts. ", aber andererseits sagst du "Na ganz einfach ein exlusives Lock anfordern.".

:?

Ist das Fazit nun, das es keine 100%ig sichere Methode gibt dafür unter *nixen?
BlackJack

sape hat geschrieben:@BlackJack:
Jetzt komme ich aber nicht mit (Drehen uns im Kreis):
Einerseits sagst du "Die Locks sind nur freundliche Hinweise. Wenn eine Anwendung nicht fragt ob gelockt ist, dann bringts auch nichts. ", aber andererseits sagst du "Na ganz einfach ein exlusives Lock anfordern.".
Vielleicht liegt's an mir, aber ich sehe den Kreis nicht. Der erste Satz war die Erklärung warum man mit ``echo`` trotzdem in die Datei schreiben konnte und mit `nano` nicht, und der zweite die Antwort wie man freundlich und *atomar* nach einem (exklusiven) Lock fragt. Zwei verschiedene Fragen, zwei verschiedene Antworten, kein Kreis. IMHO.
Ist das Fazit nun, das es keine 100%ig sichere Methode gibt dafür unter *nixen?
Eine Datei zu sperren wenn sich Programme daran zu schaffen machen, die sich nicht um Sperren kümmern? Das geht nicht. Es müssen schon alle mitspielen, die auf die Datei zugreifen.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

7crystal7 hat geschrieben:ich möchte in ein Logfile schreiben, das einfach eine Textdatei sein soll. Dabei möchte ich Zeile für Zeile anfügen, während des Zugriffs soll die Datei gelockt werden. Wie mache ich sowas?
Hallo Babsi!

Vor lauter Locking haben wir auf die wahrscheinlich einfachste und beste Lösung vergessen.

Es gibt das Modul ``logging``, welches genau dafür gedacht ist und sich um das evt. notwendige Sperren der Datei kümmert.

http://www.python-forum.de/post-40375.html#40375

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
7crystal7
User
Beiträge: 46
Registriert: Freitag 26. Mai 2006, 18:50

danke :-)
Antworten