我知道的冗长问题。指南说要问一个可以回答的问题,虽然我知道如果我们不小心,这可以转化为讨论。所以一般的方法和循环定义可能足以回答这个问题......虽然如果有代码我不会抱怨。
实现zpool status的输出确实很复杂......我知道它在PHP和VB中是可行的,我如何真正在python中实现它?一个问题,对于每个循环似乎都不适用于从linux命令行返回的字符串。
信息: 操作系统:CentOS Python:2.6.6 ..尝试升级到2.7 mysql DB
数据库关系: 是复杂的,有些专有,但我可以这样说:4个表用于池,Vdevs,子Vdevs和硬盘都是关系。
当前的Python,不是很好
#!/usr/bin/python
# -*- coding: utf-8 -*-
import MySQLdb as mdb
import sys
import os
import subprocess
try:
def get_cols(column_num):
col_return = [os.system("zpool list | awk '{print$%d}'" % column_num)]
return col_return
for line in get_cols(0):
pool_name = get_cols(1)
size = get_cols(2)
alloc = get_cols(3)
free = get_cols(4)
print(pool_name + size + alloc + free)
x = subprocess.Popen(['zpool list'])
print(x)
except mdb.Error, e:
print "Error %d: %s" % (e.args[0],e.args[1])
sys.exit(1)
当前错误
Traceback(最近一次调用最后一次):文件 " /var/www/html/pythonscripts/BH_startup.py" ;,第21行,在 x = subprocess.Popen([' zpool list'])文件" /usr/lib64/python2.6/subprocess.py",第642行, init errread,errwrite)文件" /usr/lib64/python2.6/subprocess.py",第1238行,在_execute_child中 raise child_exception OSError:[Errno 2]没有这样的文件或目录
答案 0 :(得分:0)
x = subprocess.Popen(['zpool list'])
应该是
x = subprocess.Popen(['zpool', 'list'])
答案 1 :(得分:0)
您将必须解析命令的输出以提取任何必要的信息。 在这种情况下,我们要查找ZFS池的状态:
ZFS_Pool_name = "ZFS Pool name"
cmd = ['sudo', 'zpool', 'status', ZFS_Pool_name]
ps_proc = subprocess.Popen(command, stdout=subprocess.PIPE,
close_fds=True)
output, err = ps_proc.communicate()
for entry in map(lambda x: x.strip(), result.split('\n')):
if "state" in entry:
pool_status = entry.split(" ")[-1]
# Insert this pool_status to wherever you want