我正在编写一个python脚本来自动执行一些bash命令,并且在curl命令中传递变量时遇到了麻烦。这就是我所拥有的:
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)
我正在尝试为'name'参数传递一个变量,在本例中用'someVariable'表示。但我得到一个错误说明:
"message": "Failed to decode JSON object: Expecting ',' delimiter: line 1 column 14 (char 13):
当我用实际字符串替换格式部分时,脚本执行得很好,所以我知道我在引号之间传递变量时做错了,只是不确定正确的语法是什么。
答案 0 :(得分: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'
])
答案 1 :(得分: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)