2

下面的示例代码检索所有正在运行的过程并打印它们。他们是按照此处的第三个示例此处的最后一个示例编写的。问题是我无法弄清楚为什么只有第一个检索按需要排序的进程。

我认为这与lambda功能构造有关。但是正确运行的示例,第一个示例,似乎将pfor 语句的局部变量与p.dict字典混合在一起,让我卡住了。

第一个样本:

import psutil

procs = []

for p in psutil.process_iter():
    try:
        p.dict = p.as_dict(['pid', 'name'])
    except psutil.NoSuchProcess:
        pass
    else:
        procs.append(p)

processes = sorted(procs, key=lambda p: p.dict['name'], reverse=False)

print(processes)

第二个样本:

import psutil

procs = []

for proc in psutil.process_iter():
    try:
        procs_dic = proc.as_dict(['pid', 'name'])
    except psutil.NoSuchProcess:
         pass
    else:
        procs.append(proc)

processes = sorted(procs, key=lambda ordem: procs_dic['name'], reverse=False)

print(processes)
4

3 回答 3

3

'name'无论传递什么对象,您的第二个代码片段的 lambda 都会在同一个字典中查找;这怎么可能行得通?

您的第三个似乎甚至没有尝试对流程进行排序;我不确定它与这个问题有什么关系。

您将第一个片段转换为第二个片段所做的更改显然是出于您对第一个片段的担忧

似乎将 for 语句的局部 p 变量与 p.dict 字典混合

我很乐意提供帮助,但恐怕我不明白你看到了什么问题。也许以下可能会有所帮助?这里有两个变量称为p。第一个用于循环过程;每次循环它的值都是一个进程对象,我们给这个进程对象一个dict包含一个条目的属性'name'。第二个是匿名函数 (lambda) 的参数:它的值也始终是一个进程对象。如果你愿意,你可以给它们起不同的名字,而且它不会破坏任何东西,但实际上我认为它更清楚:在这段代码p中,你称之为变量,其值为进程对象。但没有什么会“混淆”。

于 2016-11-04T17:21:08.943 回答
1

在第一个示例中,该lambda函数接受一些 varp并返回p.dict['name']。您可以p在此处更改为x或任何您想要的:它只是一个占位符。

在第二个示例中key=lambda ordem: procs_dic['name'], reverse=False)lambda接受了一些被调用的东西ordem,然后只会procs_dic['name']一遍又一遍地返回。

键的工作方式sorted是这样的:当它遍历元素并对它们进行排序时,它会调用lambda每个元素来确定按什么值对其进行排序。

我的猜测是您希望sorted第二个示例中的代码行如下所示:

processes = sorted(procs, key=lambda x: x.name(), reverse=False)

注意 Process.name() 返回进程的名称。

于 2016-11-04T17:18:37.647 回答
1

尝试使用字典映射Processes 到包含其信息的字典。

proc_dict = {}
for proc in psutil.process_iter():
    try:
        proc_dict[proc] = proc.as_dict(['name', 'pid'])
    except psutil.NoSuchProcess:
        continue

name然后按该进程的字典值排序。

print(*sorted(proc_dict, lambda x: proc_dict[x]['name']))
于 2016-11-04T17:23:03.583 回答