2016-11-17 7 views
2

私はいくつかのbashコマンドを自動化するpythonスクリプトを書いており、curlコマンドの中で変数を渡すことに問題があります。私は、この例では「someVariable」で示される「名前」パラメータのために変数を渡すようにしようとしている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)

:これは私が持っているものです。しかし、私はというエラーを取得:

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

私は実際の文字列にフォーマット部品を交換すると、スクリプトはので、私は、私はちょうど、引用符の間に変数を渡すと間違って何かをやっている知っているだけで罰金を実行します正しい構文が何であるか分かりません。

+0

'call'は、文字列のリストを取ります。 docs: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

これを実行すると、curl:try 'curl --help'または 'curl --manual'が表示されます。 ' – covfefe

+1

'shell = True'を削除してみてください。 – 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

編集で私の答えを修正しました! –

関連する問題