Beschleunigen Sie Nautilus-Python-Erweiterungen zum Lesen des Bildes des Bildes
Frage
Ich habe eine Nautilus-Erweiterung geschrieben, die die Metadaten des Bildes liest (generiert exiftool
), aber wenn ich Ordner mit vielen Dateien öffne, verlangsamt es sich wirklich den Dateimanager und hängt, bis der Lesen der Daten der Datei abgeschlossen ist.
Gibt es eine Möglichkeit, Nautilus seine Arbeit zu halten, während er meine Erweiterung läuft?Vielleicht könnten die EXIF-Daten in den Säulen allmählich erscheinen, während ich mit meiner Arbeit weitergauste. generasacodicetagpre.
Lösung
das passiert, weil Sie update_file_info aufrufen, der Teil des asynchronen IO-Systems von Nautilus ist. Daher blockiert es Nautilus, wenn die Operationen nicht schnell genug sind.
In Ihrem Fall ist es verschärft, da Sie ein externes Programm anrufen, und das ist ein teurer Betrieb. Beachten Sie, dass update_file_info einmal pro Datei genannt wird. Wenn Sie 100 Dateien haben, rufen Sie das 100-fache des externen Programms an, und Nautilus muss auf jeden warten, bevor Sie den nächsten bearbeiten.
Da sind nautilus-python 0.7 verfügbar update_file_info_full und cancel_update , mit denen Sie Async-Anrufe programmieren können. Sie können den Dokumentation von Nautilus 0.7 für Weitere Details . Es lohnt sich, dies zu erwähnen, dass dies nur eine Begrenzung von Nautilus-Python war, was zuvor die in c verfügbaren Methoden nicht freigesetzt hat.
edit : ein paar Beispiele hinzugefügt.
Der Trick macht den Prozess so schnell wie möglich oder macht es asynchron.
Beispiel 1: Aufrufen eines externen Programms
Verwenden einer vereinfachten Version Ihres Codes, wir machen asynchron mit
gobject.timeout_add_seconds in update_file_info_full .
generasacodicetagpre.
Der obige Code wird NAUTILUS nicht blockiert, und wenn in der Spaltenansicht die Spalte 'Datum Original' verfügbar ist, zeigen die JPEG- und PNG-Bilder den Wert ' unbekannt ', und langsam werden sie aktualisiert (der Unterprozess wird nach 1 Sekunde aufgerufen).
Beispiele 2: Verwenden einer Bibliothek
Anstatt ein externes Programm aufzurufen, kann es besser sein, eine Bibliothek zu verwenden. Wie das Beispiel unten:
generasacodicetagpre.
Wenn die Routine langsam ist, müssen Sie es asynchron machen (vielleicht etwas besseres als gobject.timeout_add_seconds .
Endlich, aber nicht zuletzt, in meinen Beispielen habe ich gobject introspection (typischerweise für Nautilus 3) verwendet, aber es ist einfach, ihn zu ändern, um das Modul nautilus direkt zu verwenden.
Anstatt ein externes Programm aufzurufen, kann es besser sein, eine Bibliothek zu verwenden. Wie das Beispiel unten: generasacodicetagpre.
Wenn die Routine langsam ist, müssen Sie es asynchron machen (vielleicht etwas besseres als gobject.timeout_add_seconds .
Endlich, aber nicht zuletzt, in meinen Beispielen habe ich gobject introspection (typischerweise für Nautilus 3) verwendet, aber es ist einfach, ihn zu ändern, um das Modul nautilus direkt zu verwenden.
Andere Tipps
Die obige Lösung ist nur teilweise korrekt.
Zwischen Statusänderungen für
volles Arbeitsbeispiel hier:
Dank Dave!
Ich suchte nach einer Lösung für den Text "
das Thema für mich richtig behoben :)
pro der API-API-Dokumentation
nautilus.fileinfo.invalidate_extesion_info generasacodicetagpre.
Ungerechte die Informationen NAUTILUS hat über diese Datei, wodurch neue Informationen von seinen Nautilus.infoProvider-Anbietern anfordert.