从一个函数返回一个元组并放入另一个函数中

2024-09-27 21:26:19 发布

您现在位置: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(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

我怎样才能做到这一点?你知道吗


Tags: orinfromimportdatetimedatetimeline
2条回答

接着是Pierre的回答:你可以赋值给一个未声明的变量(隐式地创建它),你不能从中赋值而不得到一个未定义的变量错误。你知道吗

您似乎还让这个糟糕的函数做了很多不相关的事情——加载模块、调用子流程、解析和重新分析数据。如果按以下方式分解,可能更容易理解和维护:

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,也不能实际运行测试它-它没有语法错误,我认为它应该正常工作,但可能需要稍微调整。你知道吗

  • 您尚未在fields函数中定义time。好吧,在那个函数中没有(time,ampm,field1,field2,field3,field4,field5,field6,field7)被定义。。。你知道吗
  • 你不能在singlelist中使用nf,除了重新分配它。你想达到什么目的?你知道吗
  • 您可以修改fields以接受参数(time,ampm,field1,field2,field3,field4,field5,field6,field7)以及method参数,但是您将如何定义它们?您仍然需要从singlelist调用fields。你知道吗

相关问题 更多 >

    热门问题