我正在尝试生成一个子进程,该子进程使用我从文件中获取的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"
}
}
}
]
答案 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)