首页 > 解决方案 > 带有系统命令的 STDOUT json 格式

问题描述

我有以下示例,我想使用 os.system 以相同的 json 格式输出变量(想法是使用系统命令输出),但输出中忽略双引号。

import json
import os
import requests

PAYLOAD_CONF = {
    "cluster": {
      "ldap": "string",
      "processes": 22
    }
}

paystr = (str(PAYLOAD_CONF))
paydic = (json.dumps(PAYLOAD_CONF))

os.system("echo "+paystr+"") 
os.system("echo "+paydic+"")

输出:

{cluster: {processes: 22, ldap: string}}
{cluster: {processes: 22, ldap: string}}

你能帮我解决一个我可以用双引号输出这个的解决方法吗?使用系统命令输出非常重要。

标签: python

解决方案


对于这种情况,您应该将变量嵌入到 shell 命令中,您应该使用shlex.quote。使用它(并进行少量清理),代码可以写成:

import json
import os
import shlex

PAYLOAD_CONF = {
    "cluster": {
        "ldap": "string",
        "processes": 22
    }
}

paydic = json.dumps(PAYLOAD_CONF)

os.system("echo " + shlex.quote(paydic))

输出:

{"cluster": {"ldap": "string", "processes": 22}}

使用subprocess

subprocess模块包含许多用于调用外部应用程序的辅助函数这些功能通常比os.system出于各种安全原因更受欢迎。

如果没有硬依赖,os.system您也可以根据需要使用其中一种:

  • subprocess.call - 即使子进程失败,这也会返回。如果返回非零值,则进程异常退出。
  • subprocess.check_call -- 如果进程异常退出,这将引发异常。
  • subprocess.check_output -- 这将从stdout子进程返回,如果它异常退出,则会引发异常。
  • ...该模块包含许多其他有用的功能,用于与子流程进行交互,如果上述内容不适合您的需求,您应该检查一下。

使用check_output,代码变为:

from subprocess import check_call
import json
import os
import shlex

PAYLOAD_CONF = {
    "cluster": {
        "ldap": "string",
        "processes": 22
    }
}

paydic = json.dumps(PAYLOAD_CONF)

check_call(["echo", paydic])

推荐阅读