Json解析Python子进程

新手上路,请多包涵

这是代码:

 inputDomain = subprocess.Popen("cat /etc/localdomains", shell=True,  stdout=subprocess.PIPE)
domains = inputDomain.stdout.read().splitlines()

for domain in domains:
   cmd = "whmapi1 domainuserdata domain " + domain
   output = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
   jsonS = json.dumps(output.communicate())
   print json.loads(jsonS)['data']

这里有错误

root@server [~/testP]# python copie.py Traceback(最近调用最后):文件“copie.py”,第 18 行,打印 json.loads(jsonS)[‘data’] TypeError:列表索引必须是整数,不是 str

这是我需要解析的 json 示例:

 {
   "data":{
      "userdata":{
      "phpopenbasedirprotect":1,
      "options":"ExecCGI Includes",
     "ip":"10.0.0.1",
     "hascgi":"1",
     "group":"user",
     "usecanonicalname":"Off",
     "scriptalias":[
        {
           "url":"/cgi-bin/",
           "path":"/home/user/public_html/cgi-bin"
        },
        {
           "url":"/cgi-bin/",
           "path":"/home/user/public_html/cgi-bin/"
        }
     ],
     "user":"user",
     "ifmodulemodsuphpc":{
        "group":"user"
     },
     "owner":"root",
     "documentroot":"/home/user/public_html",
     "userdirprotect":"",
     "serveralias":"parkeddomain.com www.parkeddomain.com www.example.com",
     "port":"80",
     "homedir":"/home/user",
     "ifmoduleconcurrentphpc":{

     },
     "customlog":[
        {
           "target":"/usr/local/apache/domlogs/example.com",
           "format":"combined"
        },
        {
           "target":"/usr/local/apache/domlogs/example.com-bytes_log",
           "format":"\"%{%s}t %I .\\n%{%s}t %O .\""
        }
     ],
     "servername":"example.com",
     "serveradmin":"webmaster@example.com"
  }
}

所以我需要用户和域,但是 python 总是回答我需要一个 int。感谢您的帮助。

原文由 marcAndreG 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 351
1 个回答

我在 Python3 下运行上面的程序时遇到问题,所以这是一种实现 OP 在 Python3 中要求的方法

import subprocess
import json

def getProcessOutput(cmd):
    process = subprocess.Popen(
        cmd,
        shell=True,
        stdout=subprocess.PIPE)
    process.wait()
    data, err = process.communicate()
    if process.returncode is 0:
        return data.decode('utf-8')
    else:
        print("Error:", err)
    return ""

for domain in getProcessOutput("cat /etc/localdomains").splitlines():
    cmd = "whmapi1 domainuserdata domain " + domain
    print(json.loads(getProcessOutput(cmd))['data'])

它输出 Error: None 因为我的机器没有 /etc/localdomains 但除此之外它似乎工作得很好。

原文由 MrMesees 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题