python subprocess 命令中包含 json ('u' 前缀错误)

标签 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)

标准错误输出以下内容:

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/

相关文章:

python - 将 fastq 文件读入字典

Python ffmpeg子进程: Broken pipe

python - 将字符串作为参数传递会添加转义字符

python - 如何使用 shell = true 使用 Python subprocess.Popen() 将 SIGINT 传递给子进程

MFCC算法的Python实现

python - 控制 Raspberry Pi 和 Python 上的 USB 网络摄像头照片捕获时间

python - 从Python客户端访问后端API

python - 保留满足两个条件的组

python-2.7 - Traits ui (enthought) 和来自 C 的回调

python - 在模块上运行 2to3.py 后仍然存在错误