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
    调用
    字段

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

函数应该从哪里获得这些名称?旧函数在使用之前没有定义这些变量,但工作正常。然而,我希望每次都有一个不同的变量列表,因此对于sar-u,字段将不同于sar-rAlso,我更新了注释,在第一个示例中忘记删除singlelist中对nf的引用