0

この説明は少し複雑かもしれないので、簡潔にしようと思います。

私は正しく動作している次のコードを持っています...

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

どうすればこれを達成できますか?

4

2 に答える 2

0

ピエールの答えのフォローアップ: TO を宣言されていない変数 (暗黙的に作成) に割り当てることができます。FROM を割り当てることはできず、未定義の変数エラーが発生します。

また、モジュールのロード、サブプロセスの呼び出し、データの解析と再解析など、その貧弱な機能に関係のないことを非常に多く実行させているようです。次のように分割すると、理解しやすく維持しやすい場合があります。

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)

注: 私はこれを Windows 7 マシンで書いているので、sar がなく、実際に実行テストすることはできません。構文エラーはなくそのままで適切に動作するはずですが、必要になる場合があります。微調整。

于 2012-09-19T02:41:02.627 に答える
0
  • time関数で定義していませんfields。まあ、(time,ampm,field1,field2,field3,field4,field5,field6,field7)その関数ではどれも定義されていません...
  • 再割り当てする場合を除いて、nfinは使用しません。singlelist何を達成しようとしていますか?
  • 引数に沿ってfieldsパラメーターを受け入れるように変更できますが、それらをどのように定義しますか? から電話する必要があります。(time,ampm,field1,field2,field3,field4,field5,field6,field7)methodfieldssinglelist
于 2012-09-18T15:29:34.033 に答える