python - 带有系统命令的 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}}
你能帮我解决一个我可以用双引号输出这个的解决方法吗?使用系统命令输出非常重要。
解决方案
对于这种情况,您应该将变量嵌入到 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])
推荐阅读
- java - 在 Hibernate @Formula 中工作 SQL 查询失败
- xml - 带有嵌套表的 XSLT 中的数据对齐问题
- python - \W 用于检测转义序列 - 正则表达式
- webpack - 循环中的图像 src.bind 给出 404
- python - Python:使用 'r+b' 读取和写入 .rps 文件
- ssis - SSIS 拆分全名和 ID 号
- python - Python:在最大randint值时再次掷骰子
- javascript - Google App Script Cache 数据类型以及如何转换为字符串
- sublimetext3 - Sublime Text 3 - 更改所选行的背景颜色
- python - Python sqlite3 - 按星期几列排序表