"%+6f" escapen?

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
jim10
User
Beiträge: 4
Registriert: Montag 1. April 2024, 00:19

Hallo!

Ich möchte exif Daten aus Bildern auslesen und erhalte die GPS Daten leider mit keinem (von mir versuchten exif Modul (exif, pyexif, exiv2,...).
Jetzt habe ich es mit subprocess versucht und erhalte die Daten (allerdings nicht im gewünschten Dezimalformat).
Dafür müsste ich folgendes aufrufen:

exiftoolout = subprocess.Popen(["exiftool -c "%+6f", file], stdout=subprocess.PIPE)

Aber ich schaffe es nicht "%+6f" richtig zu escapen.
Gibt es hier eine Möglichkeit?

exiftoolout = subprocess.Popen(["exiftool, file], stdout=subprocess.PIPE)
funktioniert, gibt mir allerdings die GPS Daten dann so aus:
47 deg 8\' 4.21" N
Das würde dann wieder Aufwand beim Umwandeln verursachen.

Beispiel für exiftool -c "%+6f" -a -gps:all uu.jpg
Da würde das ausgegeben:
GPS Longitude : +17.340048

Danke!

Jim
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das hat mit escapen nichts zu tun. Du musst die Argumente nur als Liste angeben. Du pappst aber dein Format Argument in den ersten Listeneintrag. Das wird dann als Exe gewertet, und eine mit diesem Namen gibt es nicht.

subprocess.Popen(["exiftool”, “-c”, "%+6f", file], stdout=subprocess.PIPE)

sollte das lösen. Achtung: ich tippe das hier mobil, und die Anführungszeichen sind ggf komisch, und müssen korrigiert werden.
Sirius3
User
Beiträge: 17812
Registriert: Sonntag 21. Oktober 2012, 17:20

Und statt Popen benutzt man subprocess.run, weil man will ja nur das Ergebnis und keine komplizierte Kommunikation mit dem Programm.
Benutzeravatar
__blackjack__
User
Beiträge: 13227
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Code: Alles auswählen

#!/usr/bin/env python3
import subprocess
from pathlib import Path
from pprint import pprint


def get_gps_data(file_path):
    result = {}
    for line in subprocess.run(
        ["exiftool", "-a", "-gps:all", "-c", "%+6f", str(file_path)],
        stdout=subprocess.PIPE,
        universal_newlines=True,
        check=True,
    ).stdout.splitlines():
        key, colon, value = line.partition(":")
        if colon != ":":
            raise ValueError(f"expected ':' in {line}")

        result[key.strip()] = value.strip()

    return result


def main():
    pprint(get_gps_data(Path.home() / "Downloads" / "Soundkarte.JPG"))


if __name__ == "__main__":
    main()
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
jim10
User
Beiträge: 4
Registriert: Montag 1. April 2024, 00:19

Hallo!

Vielen Dank für euere Antworten!

Mit subprocess.run habe ich es nun geschafft und das Programm läuft wie es soll!

Hintergrund (falls jemand anderes auch dieses Problem haben sollte):
Ich habe mit dem Modul "exif" bisher die GPS Daten aus den Bildern ausgelesen.
Dann ist mir aufgefallen, dass sobald ich Bilder mit Digikam bearbeitet habe (Stichwörter hinzufügen, Dateien) das "exif" Modul keine GPS Daten mehr in den Bildern findet (andere hingegen schon wie z.B. Kameraname,..)
Auch einige andere Module aus "https://pypi.org/" brachten keine GPS Daten aus den Bildern (das kann aber auch an mir gelegen haben).
Mit dem Linux bash tool exiftool funktioniert es jetzt.
Antworten