linux命令输出的python返回列表
我是python新手,学习速度很快,但这超出了我目前的理解水平。我试图将linux命令apccess的输出拉入python中的列表 APCCESS是一个linux命令,用于获取APC UPS的状态。输出如下:linux命令输出的python返回列表,python,linux,list,tuples,popen,Python,Linux,List,Tuples,Popen,我是python新手,学习速度很快,但这超出了我目前的理解水平。我试图将linux命令apccess的输出拉入python中的列表 APCCESS是一个linux命令,用于获取APC UPS的状态。输出如下: $ apcaccess APC : 001,035,0933 DATE : 2014-11-12 13:38:27 -0500 HOSTNAME : doormon VERSION : 3.14.10 (13 September 2011) debian UPSNA
$ apcaccess
APC : 001,035,0933
DATE : 2014-11-12 13:38:27 -0500
HOSTNAME : doormon
VERSION : 3.14.10 (13 September 2011) debian
UPSNAME : UPS
CABLE : USB Cable
DRIVER : USB UPS Driver
UPSMODE : Stand Alone
STARTTIME: 2014-11-12 12:28:00 -0500
MODEL : Back-UPS ES 550G
STATUS : ONLINE
LINEV : 118.0 Volts
LOADPCT : 15.0 Percent Load Capacity
BCHARGE : 100.0 Percent
TIMELEFT : 46.0 Minutes
MBATTCHG : 5 Percent
MINTIMEL : 3 Minutes
MAXTIME : 0 Seconds
SENSE : Medium
LOTRANS : 092.0 Volts
HITRANS : 139.0 Volts
ALARMDEL : 30 seconds
BATTV : 13.6 Volts
LASTXFER : No transfers since turnon
NUMXFERS : 2
XONBATT : 2014-11-12 12:33:35 -0500
TONBATT : 0 seconds
CUMONBATT: 53 seconds
XOFFBATT : 2014-11-12 12:33:43 -0500
STATFLAG : 0x07000008 Status Flag
SERIALNO : 4B1335P17084
BATTDATE : 2013-08-28
NOMINV : 120 Volts
NOMBATTV : 12.0 Volts
FIRMWARE : 904.W1 .D USB FW:W1
END APC : 2014-11-12 13:38:53 -0500
我尝试了不同的Popen
迭代,例如:
def check_apc_ups():
output = subprocess.Popen("apcaccess", stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
x1, x2, x3, x4, x5 = output
我希望能够将每一行拉入包含所有32行的列表或元组,然后只显示/打印我需要的内容,例如TIMELEFT
和BCHARGE
任何帮助都将不胜感激
from subprocess import check_output
out = check_output(["apcaccess"])
spl = [ele.split(":",1)for ele in out.splitlines()]
d = {k.rstrip():v.lstrip() for k,v in spl}
print(d['BCHARGE'])
print(d["TIMELEFT"])
100.0 Percent
46.0 Minutes
from subprocess import check_output
def get_apa():
out = check_output(["apcaccess"])
spl = [ele.split(":", 1) for ele in out.splitlines()]
d = {k.rstrip(): v.lstrip() for k, v in spl}
return d
output = get_apa()
print (output['BCHARGE'])
100.0 Percent
要打印所有键/值对,请执行以下操作:
for k,v in get_apa().items():
print("{} = {}".format(k,v))
您需要的是
子流程
模块
import subprocess
child = subprocess.Popen('apcaccess',stdout=subprocess.PIPE)
msg,err = child.communicate()
print(msg.split())
关于如何将命令的输出转换成python,已经有了答案 不清楚您将如何处理输出。也许,字典(dict)比清单更适合你:
# stolen from Hackaholic's answer
import subprocess
child = subprocess.Popen('apcaccess',stdout=subprocess.PIPE)
msg,err = child.communicate()
# now create the dict:
myDict={}
#for i in msg.split("\n"): # loop over lines
for i in msg.splitlines(): # EDIT: See comments
splitted=i.split(":") # list like ["HOSTNAME ", " doormon"]
# remove leading & trailing spaces, add to dict
myDict[splitted[0].strip()]=splitted[1].strip()
#Now, you can easily access the items:
print myDict["SERIALNO"]
print myDict["STATUS"]
print myDict["BATTV"]
for k in myDict.keys():
print k +" = "+ myDict[k]
听起来你想要str.split('\n')我喜欢使用Dict的想法,但是当我使用上面的代码时,我得到了一个“indexer-ror:list-index-out-range”。嗯,我这里没有你的权限。但是,如果msg是一个带有换行符“\n”的字符串,它应该可以工作。(此处测试)。对不起,我无意中发了这条评论。我想说的是:我想知道你的终端标识符是不同的。linux使用
\n
、windows\r\n
和Mac\r
。您可以通过打印reprr(msg)
进行检查。若要删除它,请使用msg.splitlines()
而不是msg.split(“\n”)
。如何从函数返回此信息?您能给我一个示例说明您的意思吗?抱歉。我是python新手,所以我的示例可能没有意义,但现在开始。我想在一个可以每X分钟调用一次的函数中使用这段代码:def check_apc_ups():out=check_output([“apccess”])spl=[ele.split(“:”,1)for ele in out.splitlines()]d={k.rstrip():v.lstrip()for k,v in spl}return(d['BCHARGE'])return(d[“TIMELEFT”]那么您想在函数中返回dict吗?我添加它作为一个函数,你可以通过使用键获得任何数据,如果它可以是一个dict,我对此很在行。我只是不知道如何正确有效地从函数中提取如此大的列表。