2017-06-12 74 views
1

我想解析输出的linux jq调用python脚本,将解码输出jq json str并做它的事情。解析输入argv json字符串

jq通话jq '.geometry' myJson.json的输出是这样的:

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

我已经写了一个小蟒蛇的可执行文件,解码输出JSON字符串为Python对象,然后做的事情:

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) 

这是我试图称之为:

jq '.geometry' geoJson.json | myPythonProgram 

但是我收到了一些python错误,如上面我的代码片段所述。我认为这是我通过jq输出到我的python可执行文件的方式。不知怎的,整个json字符串并没有被选作argv的参数。

我的第一个错误是print GeoJsonStrargv[1:]打印出一个空的[]切片。所以我可能会错误地将json字符串传递给python脚本。随后的错误是:

coordinates = data['coordinates'] 

TypeError: list indices must be integers, not str

这可能是或多或少因为没有什么解码。

+0

如果您'出错了,你需要把它们包含在这里。 – Carcigenicate

+0

可能与[如何在bash中创建一个python脚本“pipeable”]相同?(https://stackoverflow.com/questions/4429966/how-to-make-a-python-script-pipeable-in- bash)也许这个问题会有所帮助 –

回答

1

当您使用管道将数据发送到程序时,可以通过标准输入访问数据,而不是作为参数在argv中访问。

例如,假设您有以下程序:

foo.py:

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

管道的一些数据到它会给你的输出是这样的:

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

注意在这个例子中,对python的调用包含一个与输入完全分离的参数(foo.py)。

你的具体情况,你可以以标准输入读取直接像上面的例子中,或直接传递sys.stdin作为参数传递给json.load

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

输出应该像这样:

$ 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]]]}