在python脚本中添加引号内的变量

时间:2016-11-17 19:05:52

标签: python bash curl

我正在编写一个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):

当我用实际字符串替换格式部分时,脚本执行得很好,所以我知道我在引号之间传递变量时做错了,只是不确定正确的语法是什么。

2 个答案:

答案 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)