Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux命令输出的python返回列表_Python_Linux_List_Tuples_Popen - Fatal编程技术网

linux命令输出的python返回列表

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

我是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
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,我对此很在行。我只是不知道如何正确有效地从函数中提取如此大的列表。