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.
Hallo,
ich habe mich in letzter Zeit sehr viel mit dem Internet beschäftigt und hoste mittlerweile meinen eigenen Server mit XAMPP. Um zu schauen welcher Leute auf meinem Server unterwegs sind, hatte ich die Idee, dass ich mit einem kleinem Python Programm die letzte Zeile der access.log Datei immer wieder ausgegeben wird, solange die Datei sich verändert.(Also ich sehe jedes mal die Request, die an meinen Computer geschickt wird.)
import sys
lines1=0
lines2=0
t=0 #unnötige variable
while(True):
file1 = open("access.log")
for line in file1:
lines1=lines1+1
file.close()
file2 = open("access.log")
for line in file2:
lines2=lines2+1
file.close()
if(lines1 == lines2):
t=t+1 #unnötige Variable
else:
fp = open("access.log")
for i, line in enumerate(fp):
if (i == lines1+1):
print(line)
Elif (i == lines2+1):
print(line)
Elif i > 29:
break
fp.close()
Leider funktioniert der Code immernoch nicht...
Wenn Sie mir helfen könnten würde ich mich sehr freuen(:
@Straika: Der Code kommt nicht am Compiler vorbei, weil das kein syntaktisch korrektes Python ist.
Und auch semantisch wird das so nicht funktionieren. Warum genau nimmst Du da nicht einfach ``tail -f`` sondern versuchst Dir das selbst zu programmieren?
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Warum hast Du eine Variable, wo Du selbst mit einem Kommentar schreibst, dass sie unnötig ist, weil sie gar nicht benutzt wird?
sys wird importiert, aber dann gar nicht benutzt.
while und if sind keine Funktionen, die Klammern also unnötig und können weg.
`file` ist nicht definiert, da ist also schon der erste Fehler.
`Elif` muß `elif` heißen, und dieser Fehler kommt erst gar nicht am Compiler vobei.
Die Wahrscheinlichkeit, dass sich die Anzahl der Zeilen in `access.log` beim ersten Lesen vom zweiten Lesen unterscheidet, ist sehr gering. Außer dass hier viel Strom verbraten wird, passiert nicht viel.
Warum werden nur Zeilen ausgegeben, wenn access.log weniger als 29 Zeilen hat? Warum werden die Zeilenanzahl in jedem Schleifenlauf einfach auf die vom vorhergehenden Lauf draufaddiert?
Dateien öffnet man immer mit den with-Statement.
Straika hat geschrieben: ↑Montag 24. August 2020, 20:08
ich habe mich in letzter Zeit sehr viel mit dem Internet beschäftigt und hoste mittlerweile meinen eigenen Server mit XAMPP.
Das ist keine gute Idee.
XAMPP provides an ideal local development environment, but is not meant for production deployments.
Straika hat geschrieben: ↑Dienstag 25. August 2020, 16:38
Jetzt klappt es!
"Klappen" würde ich hier mal in Anführungszeichen setzen. Das ist zwar als kleine Übung sicher nett, aber für den produktiven Einsatz aus meiner Sicht ungeeignet. Nimm dafür, wie schon vorgeschlagen, tail. Das ist dafür gedacht, auf jedem Posix System vorhanden und berücksichtigt meist auch Randfälle und Optimierungen, auf die du selbst sehr wahrscheinlich nicht kommen wirst.
Das `more_itertools`-Modul hat eine praktische `last()`-Funktion für das was snafu gemacht hat. Ist schneller als selbst eine Schleife zu schreiben und verbraucht weniger speicher als alles in eine Liste in den Speicher zu lesen.
Der ”Trick” ist eine `collections.deque` mit einer maximalen Länge von 1, die alle Zeilen bis auf die eine letzte ”verbraucht”, falls man sich das selbst programmieren möchte.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
__blackjack__ hat geschrieben: ↑Dienstag 25. August 2020, 17:56
Der ”Trick” ist eine `collections.deque` mit einer maximalen Länge von 1, die alle Zeilen bis auf die eine letzte ”verbraucht”, falls man sich das selbst programmieren möchte.
Das hatte ich auch schon im Sinn, dachte mir aber, dass das Herstellen und unmittelbare Auflösen der Verkettungen die Sache ausbremst. Andererseits gibt es bei einelementigen deques ja gar keine Verkettung und somit entfällt auch der vermutete zusätzliche Aufwand.
nezzcarth hat geschrieben: ↑Dienstag 25. August 2020, 17:23
Nimm dafür, wie schon vorgeschlagen, tail. Das ist dafür gedacht, auf jedem Posix System vorhanden und berücksichtigt meist auch Randfälle und Optimierungen, auf die du selbst sehr wahrscheinlich nicht kommen wirst.
Ob der Unterschied zu deque(logfile, 1) wirklich so groß ist? Zudem ist letzteres portierbar. Man benutzt Python ja gerade, weil man eine Alternative zu den typischen Unix-Tools haben möchte. Auf der anderen Seite der Waage steht halt auch ein gewisser Overhead durch den Aufruf des zusätzlichen Prozesses. Also innerhalb eines Shell-Skripts wäre ich bei dir, aber in einem Python-Skript muss es IMHO nicht zwingend auf tail hinauslaufen.
snafu hat geschrieben: ↑Dienstag 25. August 2020, 18:31
Also innerhalb eines Shell-Skripts wäre ich bei dir, aber in einem Python-Skript muss es IMHO nicht zwingend auf tail hinauslaufen.
Ich habe die Frage so verstanden, dass die Funktionalität als Standalone-Skript auf einem Server laufen soll. Ich war jetzt davon ausgegangen, dass das unter Linux läuft, aber XAMPP kann darauf hindeuten, dass es Windows ist (ich hoffe es ja nicht ... ) und tail nicht unbedingt verfügbar ist. Aus einem Python Skript heraus würde ich auch nicht tail nehmen, sondern es ähnlich wie von euch gezeigt direkt in Python umsetzen.
Das X sagt schon, dass es sich um ein *niX handelt, sonst wäre es ein WAMPP.
In der ursprünglichen Frage ging es auch gar nicht wirklich um sie letzte Zeile, sondern um neu hinzu kommende Zeilen. Und das machte tail während ein Python-Programm da deutlich aufwändiger ist als zwei Zeilen.
@Sirius3: Inzwischen heißt das Komplettpaket für alle Plattformen gleich. Kein WAMPP, MAMPP oder LAMPP mehr. Es könnte also wirklich ein Windows sein. Wenn Straika erst vor ein paar Monaten damit angefangen hat, sich mit der Erstellung von Internetseiten und deren technische Grundlage zu beschäftigen, wird er nur ein XAMPP gefunden haben, dass man für verschiedene Betriebssysteme herunterladen kann.
Sirius3 hat geschrieben: ↑Mittwoch 26. August 2020, 07:31
Das X sagt schon, dass es sich um ein *niX handelt, sonst wäre es ein WAMPP.
Nein. Wie sparrow schon meinte, ist XAMPP eine schlüsselfertiger Webstack, der, soweit ich weiß, vor allem und insbesondere bei Entwicklern, die unter Windows arbeiten verbreitet ist. Daher die Anmerkung