2016-11-17 183 views
2

我在寫一個python腳本來自動化一些bash命令,並且在curl命令中傳遞一個變量時遇到了麻煩。這是我有:在python腳本中添加引號內的變量

subprocess.call('''curl -H 'Content-Type: application/json' -X PUT -d '{"name": "{}".format(someVariable), "hive_ql": "CREATE VIEW user_balance AS SELECT NAME, LOB,ACCOUNT,BALANCE FROM csvtable"}' localhost:someport/api''', shell=True)

我想傳遞一個變量中的「名稱」參數,通過「someVariable」在這個例子中表示。但是,我得到一個錯誤,指出:

"message": "Failed to decode JSON object: Expecting ',' delimiter: line 1 column 14 (char 13):

當我與一個實際的字符串替換格式的一部分,腳本執行就好了,所以我知道我在做什麼毛病傳遞引號之間的變量,只是不確定正確的語法是什麼。

+0

'call'需要字符串列表。請參閱文檔:https://docs.python.org/3/library/subprocess.html#subprocess.run –

+0

不要試圖生成這樣的JSON;使用'json.dumps'。 – chepner

回答

2

這將是更清晰的列表傳遞給subprocess.call

import json 
import subprocess 

someVariable = 'hello' 
hive_ql = 'CREATE VIEW user_balance AS SELECT NAME, LOB,ACCOUNT,BALANCE FROM csvtable' # noqa 

subprocess.call([ 
    'curl', 
    '-H', 
    'Content-Type: application/json', 
    '-X', 
    'PUT', 
    '-d', 
    json.dumps({ 
     'name': str(someVariable), 
     'hive_ql': hive_ql 
    }), 
    'localhost:someport/api' 
]) 
+0

當我運行這個,我得到'捲曲:嘗試'捲曲 - 幫助'或'捲曲 - 手動'的更多信息' – covfefe

+1

嘗試刪除'殼=真' – JuniorCompressor

+0

^這工作,謝謝!任何想法爲什麼這可能是問題? – covfefe

1

你不叫.format,它在你的字符串。試試這個:

subprocess.call('''curl -H 'Content-Type: application/json' -X PUT -d '{"name": "{}", "hive_ql": "CREATE VIEW user_balance AS SELECT NAME, LOB,ACCOUNT,BALANCE FROM csvtable"}' localhost:someport/api'''.format(someVariable), shell=True) 

既然這樣,你試圖解碼JSON是:

{ 
    "name": "{}".format(someVariable), 
    "hive_ql": "CREATE VIEW user_balance AS SELECT NAME, LOB,ACCOUNT,BALANCE FROM csvtable" 
} 

因爲Python是剛剛處理.format(someVariable)作爲字符串的一部分,而不是與價值取代它someVariable,顯然這是不正確的JSON掛在字符串的末尾。

編輯:我忘了跳過括號;試試這個來代替:

subprocess.call('''curl -H 'Content-Type: application/json' -X PUT -d '{{"name": "{}", "hive_ql": "CREATE VIEW user_balance AS SELECT NAME, LOB,ACCOUNT,BALANCE FROM csvtable"}}' localhost:someport/api'''.format(someVariable), shell=True) 
+0

當我跑這個時,我得到了KeyError:''name'' – covfefe

+0

修復了我在編輯中的答案! –

相關問題