Python - Wie überprüft man, ob eine Datei von einer anderen Anwendung verwendet wird?

8

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.

    
Gilad Naor 26.02.2009, 06:44
quelle

3 Antworten

7

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. :)

  1. Betriebssystemunabhängiger Weg : Wenn man davon ausgehen kann, dass die Legacy-Anwendung die Datei für höchstens eine bekannte Zeit geöffnet hält, sagen wir 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
    • subtrahieren Sie die Änderungszeit der Datei von now() , was D ergibt
    • wenn T & lt; = D & lt; X dann öffne die Datei und mache damit was du brauchst
    • Dies ist möglicherweise sicher genug für Ihre Anwendung . Die Sicherheit erhöht sich, wenn 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
  2. Windows : Zusätzlich (oder anstelle der oben beschriebenen OS-unabhängigen Methode) können Sie Folgendes versuchen:
    • sharing (locking): Dies setzt voraus, dass das Legacy-Programm die Datei auch im freigegebenen Modus öffnet (normalerweise der Standard in Windows-Apps); Wenn Ihre Anwendung die Sperre erhält, während die Legacy-Anwendung dasselbe versucht (Race-Bedingung), schlägt die Legacy-Anwendung fehl.
      • das ist extrem aufdringlich und fehleranfällig. Wenn sowohl die neue Anwendung als auch die Legacy-Anwendung einen synchronisierten Zugriff für das Schreiben in dieselbe Datei benötigen und Sie bereit sind, die Möglichkeit zu behandeln, dass die Legacy-Anwendung das Öffnen der Datei verweigert, verwenden Sie diese Methode nicht.
    • versucht herauszufinden, welche Dateien in der Legacy-Anwendung geöffnet sind, unter Verwendung derselben Techniken wie ProcessExplorer (das Äquivalent von * nix lsof )
      • Sie sind sogar noch rassistischer als die OS-unabhängige Technik
  3. Linux / etc. : zusätzlich (oder anstelle der oben beschriebenen OS-unabhängigen Methode) können Sie versuchen, dieselbe Methode wie lsof zu verwenden oder auf einigen Systemen einfach zu prüfen, welche Datei Der symbolische Link /proc/<pid>/fd/<fdes> zeigt auf
    • Sie sind sogar noch rassistischer als die OS-unabhängige Technik
    • Es ist sehr unwahrscheinlich, dass die Legacy-Anwendung Locking verwendet, aber wenn dies der Fall ist, ist Sperren keine echte Option, es sei denn, die Legacy-Anwendung kann eine gesperrte Datei ordnungsgemäß verarbeiten (durch Blockieren, nicht durch Fehler) und wenn Ihre eigene Anwendung dies garantieren kann dass die Datei nicht gesperrt bleibt und die ältere Anwendung für längere Zeiträume blockiert.)

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:

  1. überprüft, ob die alte Anwendung die Datei geöffnet hat (a la lsof oder ProcessExplorer )
  2. den Legacy-Anwendungsprozess aussetzen
  3. Wiederholen der Überprüfung in Schritt 1, um zu bestätigen, dass die Legacy-Anwendung die Datei zwischen den Schritten 1 und 2 nicht geöffnet hat; Verzögern und starten Sie bei Schritt 1 neu, wenn dies der Fall ist, andernfalls fahren Sie mit Schritt 4
  4. fort
  5. Machen Sie Ihr Geschäft mit der Datei - im Idealfall benennen Sie es einfach für die nachfolgende, unabhängige Verarbeitung um, um die Legacy-Anwendung für einen minimalen Zeitraum auszusetzen
  6. Wiederaufnahme des Legacy-Anwendungsprozesses
vladr 26.02.2009, 06:55
quelle
0

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.

    
Peter Rowell 26.02.2009 06:56
quelle
0

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.

    
Jim Carroll 26.02.2009 19:50
quelle

Tags und Links