2017-06-12 2 views
1

Ich möchte die Ausgabe von einem Linux jq Aufruf in ein Python-Skript, das die Ausgabe jq json str dekodieren und Dinge damit tun wird.Parsing Eingabe argv JSON Zeichenfolge

Der Ausgang meines jq Anruf jq '.geometry' myJson.json so etwas wie diese:

{ 
    "coordinates": [ 
    [ 
     [ 
     5, 
     2 
     ], 
     [ 
     5.4, 
     3 
     ], 
     [ 
     3, 
     2.1 
     ] 
    ] 
    ], 
    "crs": { 
    "properties": { 
     "name": "foo" 
    }, 
    "type": "name" 
    }, 
    "type": "Polygon" 
} 

ich ein kleines Python-Executable geschrieben habe, die die Ausgabe json Zeichenfolge in Python-Objekte und dann Dinge tun, dekodiert:

import collections 
import json 
import sys 
import logging 

if __name__ == '__main__': 

    try: 
     geoJsonStr = str(sys.argv[1:]) 
     print geoJsonStr ## This for some reason only prints an empty slice '[]' 
     data = json.loads(geoJsonStr) 
     coordinates = data['coordinates'] ## TypeError: list indices must be integers, not str 
     ## Do things here 

    except ValueError as e: 
     logging.error(e.message) 
     exit(1) 

So versuche ich es zu nennen:

Ich erhalte jedoch einige Python-Fehler, wie oben in meinem Code-Snippet erwähnt. Ich denke, es ist die Art, wie ich die jq Ausgabe in meine Python-ausführbare Datei übergebe. Irgendwie wird die gesamte JSON-Zeichenfolge nicht als argv-Argument aufgenommen.

Mein erster Fehler ist die print GeoJsonStr druckt eine leere [] Scheibe aus argv[1:]. Daher übergebe ich die json-Zeichenfolge wahrscheinlich fälschlicherweise in das Python-Skript. Der nachfolgende Fehler ist:

coordinates = data['coordinates'] 

TypeError: list indices must be integers, not str

Dies ist wahrscheinlich mehr oder weniger, weil es nichts zu entschlüsseln.

+0

Wenn Sie:

import sys ... obj = json.load(sys.stdin) print obj 

Der Ausgang wie so aussehen sollte Wenn Sie Fehler bekommen, müssen Sie sie hier einfügen. – Carcigenicate

+0

Möglicherweise die gleiche Frage wie [Wie mache ich ein Python-Skript "pipable" in bash?] (Https://stackoverflow.com/questions/4429966/how-to-make-a-python-script-pipeable-in- bash) Vielleicht wird diese Frage helfen –

Antwort

1

Wenn Sie eine Pipe verwenden, um Daten an ein Programm zu senden, können Sie auf die Daten über stdin zugreifen, nicht mit einem Argument in argv.

Beispiel: Angenommen, Sie hatten das folgende Programm:

foo.py:

import sys 
data = sys.stdin.read() 
print "I got", len(data), "characters!" 

Piping einige Daten in diese würden Sie Ausgabe wie folgt geben:

$ echo "foobar" | python foo.py 
I got 6 characters! 

Beachten Sie, dass In diesem Beispiel enthält der Aufruf von python ein Argument (foo.py), das vollständig von der Eingabe getrennt ist.

In Ihrem speziellen Fall, dass Sie stdin direkt wie im obigen Beispiel lesen konnte, oder passieren sys.stdin direkt als Argument an json.load:

$ jq '.geometry' geoJson.json | python myPythonProgram.py 
{u'crs': {u'type': u'name', u'properties': {u'name': u'foo'}}, u'type': u'Polygon', u'coordinates': [[[5, 2], [5.4, 3], [3, 2.1]]]}