<p>接着是Pierre的回答:你可以赋值给一个未声明的变量(隐式地创建它),你不能从中赋值而不得到一个未定义的变量错误。你知道吗</p>
<p>您似乎还让这个糟糕的函数做了很多不相关的事情——加载模块、调用子流程、解析和重新分析数据。如果按以下方式分解,可能更容易理解和维护:</p>
<pre><code>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))
</code></pre>
<p>现在您可以很容易地定义函数,如下所示:</p>
<pre><code>def single_list():
today = datetime.datetime.now().date()
fmt = "{} {} {} {}".format(today, '{time}', '{ampm}', '{memused_pct}')
return get_system_stats("mem", fmt)
</code></pre>
<p>注意:我是在Windows7机器上写的,所以我没有sar,也不能实际运行测试它-它没有语法错误,我认为它应该正常工作,但可能需要稍微调整。你知道吗</p>