带有json的python subprocess命令(' u'前缀错误)

时间:2017-06-19 08:55:56

标签: python python-2.7 subprocess

我正在尝试生成一个子进程,该子进程使用我从文件中获取的json参数来调用命令。但是,子进程使用的json参数似乎产生错误,因为json有一个u前缀来表示它是unicode。

我不知道如何解决这个问题,因为我认为在编写命令时我已经将json转换为字符串

import sys
import json
from subprocess import Popen, PIPE

json_file = sys.argv[1]

# Read the provided policy file
with open(json_file, 'r') as f:
    values= json.load(f)

for value in values:
    command = ('''value definition create --name {} --rules '{}'
        ''').format(value['name'], value['definition'])

    p = Popen(command, stdout=PIPE, stderr=PIPE, shell=True)
    stdout, stderr = p.communicate()
    print(stdout)
    print(stderr)

std错误输出以下内容:

error: unrecognized arguments: values uif: {ufield: utype, ...

这是json文件:

[  
    {  
        "name":"testValue",
        "definition":{  
            "if":{  
                "field":"type",
                "in":[  
                    "TestValue"
                ]
            },
            "then":{  
                "effect":"Deny"
            }
        }
    }
]

1 个答案:

答案 0 :(得分:1)

命令行程序采用字节字符串,而不是unicode对象。通常这意味着它们接受ASCII字符串,但它可以是任何编码。您尚未指出程序所期望的编码。

尝试此操作:在format之前 - 将一个字符串传递给Popen,然后调用.encode('utf-8')

另外,我发现definition是一个复杂的对象。当您将其传递给str.format时,它将被格式化为具有Python语法的字符串。这似乎不太可能是你的外部程序所期望的。

除非您绝对需要,否则最好避免shell=True,特别是如果您的命令行参数可能包含引号。你应该这样做:

args = [
    'value',
    'definition',
    'create',
    '--name', value['name'],
    '--rules', value['definition'],
]
p = Popen(command, stdout=PIPE, stderr=PIPE)