Ich möchte eine Datei öffnen, die von einer anderen Anwendung regelmäßig beschrieben wird. Diese Anwendung kann nicht geändert werden. Ich möchte daher die Datei nur öffnen, wenn ich weiß, dass sie nicht von einer anderen Anwendung geschrieben wurde.
Gibt es einen pythonischen Weg, dies zu tun? Wie erreiche ich das sonst unter Unix und Windows?
bearbeiten : Ich versuche es zu klären. Gibt es eine Möglichkeit zu überprüfen, ob die aktuelle Datei von einer anderen Anwendung geöffnet wurde?
Ich möchte mit dieser Frage beginnen. Ob diese andere Anwendung lesen / schreiben ist für jetzt irrelevant.
Ich realisiere, dass es wahrscheinlich vom Betriebssystem abhängig ist, also ist das möglicherweise nicht wirklich im Zusammenhang mit Python.
Will Ihr Python-Skript die Datei zum Schreiben oder Lesen öffnen? Ist die Legacy-Anwendung das Öffnen und Schließen der Datei zwischen Schreibvorgängen, oder hält sie sie geöffnet?
Es ist äußerst wichtig, dass wir verstehen, was die Legacy-Anwendung macht und was Ihr Python-Skript zu erreichen versucht.
Dieser Funktionsbereich ist stark vom Betriebssystem abhängig, und die Tatsache, dass Sie keine Kontrolle über die Legacy-Anwendung haben, macht es leider nur noch schwieriger. Ob es eine pythische oder nicht-pythische Art gibt, dies zu tun, wird wahrscheinlich die geringste Ihrer Sorgen sein - die schwierige Frage wird sein, ob das, was Sie erreichen wollen, überhaupt möglich sein wird.
AKTUALISIEREN
OK, also wisse (aus deinem Kommentar), dass:
Die Legacy-Anwendung wird geöffnet und Schließen der Datei alle X Minuten, aber Ich will das nicht bei t = annehmen t_0 + n * X + eps ist bereits geschlossen die Datei.
Dann werden die Parameter des Problems geändert. Es kann tatsächlich in einer OS-unabhängigen Weise unter einigen Annahmen oder als eine Kombination von OS-abhängigen und OS-unabhängigen Techniken durchgeführt werden. :)
T
Sekunden (zB öffnet die Datei, führt einen Schreibvorgang durch, schließt dann die Datei) und öffnet sie mehr oder weniger alle X
Sekunden, wobei X
größer als 2 * T
ist.
stat
die Datei now()
, was D
ergibt
T
& lt; = D
& lt; X
dann öffne die Datei und mache damit was du brauchst T
/ X
abnimmt. On * nix müssen Sie möglicherweise /etc/ntpd.conf
überprüfen, um die Zeitschritt- und die Slew-Konfiguration richtig zu konfigurieren (siehe basteln). Unter Windows finden Sie MSDN
lsof
)
lsof
zu verwenden oder auf einigen Systemen einfach zu prüfen, welche Datei Der symbolische Link /proc/<pid>/fd/<fdes>
zeigt auf
UPDATE 2
Wenn Sie die "Überprüfung, ob die Legacy-Anwendung die Datei geöffnet hat" bevorzugen (eine für die Rennbedingungen anfällige intrusive Vorgehensweise), können Sie die genannte Race Condition folgendermaßen lösen:
lsof
oder ProcessExplorer
) Unix hat keine Dateisperrung als Standard. Der beste Vorschlag, den ich für eine Unix-Umgebung habe, wäre, die Quellen für den Befehl lsof zu betrachten. Es weiß genau, welcher Prozess welche Dateien geöffnet hat. Sie könnten das als Grundlage für Ihre Lösung verwenden. Hier sind die Ubuntu-Quellen für lsof.
Eine Sache, die ich getan habe, ist, dass Python die Datei vorübergehend kurz umbenennt. Wenn wir es umbenennen können, verwendet es kein anderer Prozess. Ich habe das nur unter Windows getestet.