我正在尝试生成一个子进程,该子进程使用从文件中获取的 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)
标准错误输出以下内容:
error: unrecognized arguments: values uif: {ufield: utype, ...
这是 json 文件:
[
{
"name":"testValue",
"definition":{
"if":{
"field":"type",
"in":[
"TestValue"
]
},
"then":{
"effect":"Deny"
}
}
}
]
最佳答案
命令行程序采用字节字符串,而不是 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)
关于python subprocess 命令中包含 json ('u' 前缀错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44626141/