【问题标题】:python subprocess command with json in it ('u' prefix error)带有json的python子进程命令('u'前缀错误)
【发布时间】:2017-06-19 08:55:55
【问题描述】:

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

【问题讨论】:

  • 请说明valuescommand 是什么。

标签: python python-2.7 subprocess


【解决方案1】:

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

试试这个:在format-ing 一个要传递给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)

【讨论】:

  • 我尝试在 Popen 之前在命令上调用 .encode('utf-8'),但遗憾的是它没有效果,因为 u 仍然存在于命令中
  • 另外,是的,我理想情况下需要缩进输出,这样它就像在文件中一样,只是被 ' ' 包围,但显然没有 u
  • 你能展示一个调用这个程序的工作示例吗?
  • 或许这个问题会对你有所帮助:stackoverflow.com/questions/956867/…
猜你喜欢
  • 2021-09-10
  • 2020-11-08
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 2017-06-17
相关资源
最近更新 更多