这是代码:
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']
Run Code Online (Sandbox Code Playgroud)
这里有错误
root@server [~/testP]# python copie.py Traceback(最近一次调用最后一次):文件“copie.py”,第 18 行,打印中 json.loads(jsonS)['data'] 类型错误:列表索引必须是整数,而不是 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"
}
}
Run Code Online (Sandbox Code Playgroud)
所以我需要用户和域名,但 python 总是回答我需要一个 int。谢谢你们的帮助。
我在 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'])
Run Code Online (Sandbox Code Playgroud)
它输出Error: None是因为我的机器没有/etc/localdomains,否则它似乎工作得很好。
由于您的进程返回一个json字符串,因此无需dump再次加载它。
# stdout, stderr
jsonS,_ = output.communicate()
Run Code Online (Sandbox Code Playgroud)
现在你有一个字符串,你可以使用它加载 json
d = json.loads(jsonS)
Run Code Online (Sandbox Code Playgroud)
现在d['data']产生你想要的信息
旁白:正如我所说:
inputDomain = subprocess.Popen("cat /etc/localdomains", shell=True, stdout=subprocess.PIPE)
domains = inputDomain.stdout.read().splitlines()
Run Code Online (Sandbox Code Playgroud)
可以用原生 python 替换:
with open("/etc/localdomains") as f: domains = f.read.splitlines()
Run Code Online (Sandbox Code Playgroud)
communicate()返回一个元组:(stdoutdata, stderrdata). 当你loads()返回时,你会得到一个列表,然后尝试对其进行索引'data'将会失败。例子:
import json
import subprocess
cmd = "/bin/date"
output = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
jsonS = json.dumps(output.communicate())
print jsonS # ["Fri Feb 10 14:33:42 GMT 2017\n", null]
print json.loads(jsonS)['data'] # TypeError: list indices must be integers, not str
Run Code Online (Sandbox Code Playgroud)
这可能就足够了
jsonS = output.communicate()[0]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19067 次 |
| 最近记录: |