Python 从一个函数返回一个元组并放入另一个函数中
这个描述可能有点复杂,所以我会尽量简短 我有以下代码可以正常工作Python 从一个函数返回一个元组并放入另一个函数中,python,Python,这个描述可能有点复杂,所以我会尽量简短 我有以下代码可以正常工作 def singlelist(): from datetime import datetime from subprocess import Popen from subprocess import PIPE output=Popen(["sar","-r"], stdout=PIPE).communicate()[0] date=datetime.now() date=str(da
def singlelist():
from datetime import datetime
from subprocess import Popen
from subprocess import PIPE
output=Popen(["sar","-r"], stdout=PIPE).communicate()[0]
date=datetime.now()
date=str(date).split()[0]
listtimeval=[]
for line in output.split('\n'):
if line == '' or 'Average' in line or 'kb' in line or 'Linux' in line or 'RESTART' in line:
pass
else:
(time,ampm,field1,field2,field3,field4,field5,field6,field7) = line.split()
listtimeval.append((time + " "+ ampm + "," + field3).split(','))
updatelist= [ [str(date) + " " +x[0],x[1]] for x in listtimeval]
return updatelist
val=singlelist()
…请注意,之前没有定义时间、ampm等
我试图使其更具动态性,因为sar的输出并不总是具有相同的列数
我想做的是
def fields(method):
if method == '-r':
nf = (time,ampm,field1,field2,field3,field4,field5,field6,field7)
return nf
def singlelist(nf):
from datetime import datetime
from subprocess import Popen
from subprocess import PIPE
output=Popen(["sar","-r"], stdout=PIPE).communicate()[0]
date=datetime.now()
date=str(date).split()[0]
listtimeval=[]
for line in output.split('\n'):
if line == '' or 'Average' in line or 'kb' in line or 'Linux' in line or 'RESTART' in line:
pass
else:
nf = line.split()
listtimeval.append((time + " "+ ampm + "," + field3).split(','))
updatelist= [ [str(date) + " " +x[0],x[1]] for x in listtimeval]
return updatelist
method='-r'
nf=fields(method)
val=singlelist(nf)
然而我得到这个
Traceback (most recent call last):
File "./Logic.py", line 110, in <module>
nf=fields(method)
File "./Logic.py", line 58, in fields
nf = (time,ampm,field1,field2,field3,field4,field5,field6,field7)
NameError: global name 'time' is not defined
回溯(最近一次呼叫最后一次):
文件“/Logic.py”,第110行,在
nf=字段(方法)
文件“/Logic.py”,第58行,在字段中
nf=(时间、ampm、字段1、字段2、字段3、字段4、字段5、字段6、字段7)
NameError:未定义全局名称“时间”
我如何才能做到这一点?- 您尚未在
函数中定义字段
。嗯,时间
都没有在该函数中定义(时间、ampm、字段1、字段2、字段3、字段4、字段5、字段6、字段7)
- 在
中不使用singlelist
,只用于重新分配它。你想达到什么目标nf
- 您可以修改
以接受参数字段
以及(时间、ampm、字段1、字段2、字段3、字段4、字段5、字段6、字段7)
参数,但如何定义它们?您仍然需要从方法
调用singlelist
字段
import datetime
from itertools import izip
from subprocess import Popen, PIPE
def call_sar(options, columns):
sar = Popen(["sar"]+options, stdout=PIPE) # create subprocess
res = sar.communicate()[0] # get stdout text
data = res.splitlines()[3:-1] # grab the relevant lines
return (dict(izip(columns, row.split())) for row in data)
def get_system_stats(mode, fmt=None):
modes = { # different ways to call sar, and the values returned by each
"all_cpus": ('-r', 'time ampm cpu user_pct nice_pct system_pct iowait_pct steal_pct idle_pct'),
"each_cpu": ('-P', 'time ampm cpu user_pct nice_pct system_pct iowait_pct steal_pct idle_pct'),
"mem": ('-r', 'time ampm memfree_kb memused_kb memused_pct buffers_kb cached_kb commit_kb commit_pct active_kb inactive_kb'),
"swap": ('-S', 'time ampm swapfree_kb swapused_kb swapused_pct swapcad_kb swapcad_pct'),
"all_io": ('-b', 'time ampm ts read_ts write_ts read_bs write_bs'),
"each_io": ('-p -d', 'time ampm dev ts read_ss write_ss avg_req_sz avg_queue_sz avg_wait'),
"switch": ('-w', 'time ampm proc_s switch_s'),
"queue": ('-q', 'runq_sz plist_sz avg_load_1 avg_load_5 avg_load_15 blocked')
}
if mode in modes:
options, columns = modes[mode]
data = call_sar(options.split(), columns.split())
if fmt is None:
# return raw data (list of dict)
return list(data)
else:
# return formatted data (list of str)
return [fmt.format(**d) for d in data]
else:
raise ValueError("I don't know mode '{}'".format(mode))
现在,您可以像这样轻松定义函数:
def single_list():
today = datetime.datetime.now().date()
fmt = "{} {} {} {}".format(today, '{time}', '{ampm}', '{memused_pct}')
return get_system_stats("mem", fmt)
注意:我是在Windows7机器上写这篇文章的,所以我没有sar,也不能实际运行测试它-它没有语法错误,我认为它应该可以正常工作,但是它可能需要稍微调整。函数应该从哪里获得这些名称?旧函数在使用之前没有定义这些变量,但工作正常。然而,我希望每次都有一个不同的变量列表,因此对于sar-u,字段将不同于sar-rAlso,我更新了注释,在第一个示例中忘记删除singlelist中对nf的引用