如何读取json字符串作为python脚本的输入

时间:2017-12-12 09:26:32

标签: python json

我正在编写一个shell脚本test.sh,其中我将json_str变量定义为

json_str='{"ecommerce": "master","app_compat":"master"}'

我将此变量传递给python脚本命令 - >

sudo python3 release.py $json_str

在python脚本中我打印输入的值是打印这个

{"ecommerce":

不是整个字符串。 我无法更改输入字符串,因为它来自无法更改的服务器。 解决方法是

json_str='{\"\ecommerce": \"\master",\"
\app_compat":\"\master"\}'

你可以建议另一种方法来做这件事,因为我无法改变输入字符串。

内部python脚本

input_release=sys.argv[1]

print("here input %s" %input_release)

shell脚本

#!/usr/bin/env bash

echo "Inside bash script"
json_str='{"ecommerce": "master","app_compat":"master"}'

echo "$json_str"
sudo python3 release.py $json_str

2 个答案:

答案 0 :(得分:0)

由于JSON中的空格而中断。您可以通过引用它将其作为单个参数传递:

sudo python3 release.py "$json_str"

但是如果你不能改变CLI,你可能会尝试在Python中重新创建它:

sudo python3 release.py $json_str

...

import sys

json_data = " ".join(sys.argv[1:])
print("JSON data: ", json_data)
# JSON data: {"ecommerce": "master","app_compat":"master"}

虽然要注意你不能以这种方式考虑所有的shell扩展,而CLI并不是真正用于传递类似JSON的大型结构,所以为什么不将它作为环境变量传递,即在你的shell脚本中:

#!/usr/bin/env bash

json_str='{"ecommerce": "master","app_compat":"master"}'

export $json_str
sudo python3 release.py

并在您的Python脚本中:

import os

json_data = os.environ["json_str"]
print("JSON data: ", json_data)
# JSON data: {"ecommerce": "master","app_compat":"master"}

答案 1 :(得分:0)

问题既不是Python也不是Json,而是shell本身。当您使用以下行提供shell时:

sudo python3 release.py $json_str

这是按顺序发生的事情

  • 变量由其赋值sudo python3 release.py {"ecommerce": "master","app_compat":"master"
  • 的值替换
  • 该行标记为单词:1:sudo 2:python3 3:release.py 4:{"ecommerce": 5:"master","app_compat":"master"因为它们之间的空间:"master"

避免分裂的常用方法是将要替换的变量括在引号中。不幸的是你不能在这里做,因为字符串已经包含引号。

我只能想象两个解决方案:

  1. 确保替换字符串不包含未转义的空格(单个\,因为它出现在简单的引号内):

    json_str='{"ecommerce":\ "master","app_compat":"master"}'
    
  2. 使用标准输入来读取字符串

    Python3:input_release = input()或Python2:input_release = rawinput()

    shell:echo $json_str | sudo python release.py,或者带有此处的文档:

    sudo python release.py <<END
    $json_str
    END