2017-06-12 119 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]]]}