Python 3 psutil,提取pid 和name 值?
Python 3 psutil, extracting pid and name values?
对于 Python 3.5 on Windows 7 64 位和 psutil 5 库。
我对如何正确访问 class 'psutil.Process' 返回的每个 项中提供的名称和 pid 信息感到困惑= ]psutil.process_iter().
下面的代码returns一个class'generator'对象:
import psutil
curProcesses = psutil.process_iter()
一个简单的循环输出该生成器中包含的每个 class 'psutil.Process' 对象:
for eachProcess in curProcesses:
print(eachProcess)
输出:
psutil.Process(pid=0, name='System Idle Process')
psutil.Process(pid=4, name='System')
... and so on ...
这就是我感到困惑的地方。
如果我按如下方式修改之前的循环,那么我将得到一个整数 pid 和一个字符串 name.
for eachProcess in curProcesses:
# Observe the two different forms of access.
print(eachProcess.pid)
print(eachProcess.name())
输出:
0
System Idle Process
4
System
... and so on ...
生成的整数和字符串正是我想要的。然而,经过几次实验,我只能得到它们 IF:
eachProcess.pid 后面没有括号 eachProcess.pid。 (添加括号会产生 TypeError: 'int' object is not callable 异常。)
eachProcess.name 后跟圆括号 eachProcess.name()。 (删除括号 returns 绑定方法 Process.name 而不是名称作为字符串。)
为什么两个看起来像关键字的参数 pid 和 name 表现不同? (我怀疑我即将学习一些关于 Python 3 个生成器对象的非常有用的东西...)
真的没什么:pid
is a read-only attribute (created with the @property
decorator), and name()
is a method, both of the Process
class. Methods need parens to be called in order to return data, while attributes are accessed without them. This bit of documentation might be helpful. Also, if you find it helpful, you can see the difference in implementation between name()
and pid
。
至于为什么 pid
是Process
的只读属性,而name()
需要调用方法为了获得进程名称,我不确定。事实上,pid
似乎是进程 class 上唯一的只读属性,而有关进程实例的所有其他信息都是通过方法调用检索的。就个人而言,似乎 inconsistent/non-standard 这样做,但我认为这种选择有充分的理由。我认为主要原因是 PID 不能意外更改,因为它是一个关键组件。如果 PID 是一个方法而不是只读属性,那么循环中的 eachProcess.pid = 123
会将方法更改为 int 123
,而按照当前的方式,这种尝试重新分配将引发错误相反,这样 PID 在某种意义上受到保护,而 eachProcess.name = 'foo'
可能不会引发错误。
此外,请注意,虽然它们在 Process
class 实例的字符串表示中的显示方式可能看起来像关键字参数,但 name()
和 pid
是不是关键字参数(虽然 pid
可以在创建 Process
实例时作为关键字参数传递,但这不是这里发生的事情)。
我制作了 pid
一个 class 属性 / 属性 主要是为了与 subprocess.Popen.pid
和 multiprocessing.Process.pid
stdlib 模块保持一致(threading.Thread.ident
记住)。
此外,它不需要任何计算(与 name()
、cmdline()
等相反)并且它永远不会改变,所以只读的东西当时对我来说更有意义.
这是一个 属性 而不仅仅是一个属性,只是为了在用户尝试 change/set 时出错。
对于 Python 3.5 on Windows 7 64 位和 psutil 5 库。
我对如何正确访问 class 'psutil.Process' 返回的每个 项中提供的名称和 pid 信息感到困惑= ]psutil.process_iter().
下面的代码returns一个class'generator'对象:
import psutil
curProcesses = psutil.process_iter()
一个简单的循环输出该生成器中包含的每个 class 'psutil.Process' 对象:
for eachProcess in curProcesses:
print(eachProcess)
输出:
psutil.Process(pid=0, name='System Idle Process')
psutil.Process(pid=4, name='System')
... and so on ...
这就是我感到困惑的地方。
如果我按如下方式修改之前的循环,那么我将得到一个整数 pid 和一个字符串 name.
for eachProcess in curProcesses:
# Observe the two different forms of access.
print(eachProcess.pid)
print(eachProcess.name())
输出:
0
System Idle Process
4
System
... and so on ...
生成的整数和字符串正是我想要的。然而,经过几次实验,我只能得到它们 IF:
eachProcess.pid 后面没有括号 eachProcess.pid。 (添加括号会产生 TypeError: 'int' object is not callable 异常。)
eachProcess.name 后跟圆括号 eachProcess.name()。 (删除括号 returns 绑定方法 Process.name 而不是名称作为字符串。)
为什么两个看起来像关键字的参数 pid 和 name 表现不同? (我怀疑我即将学习一些关于 Python 3 个生成器对象的非常有用的东西...)
真的没什么:pid
is a read-only attribute (created with the @property
decorator), and name()
is a method, both of the Process
class. Methods need parens to be called in order to return data, while attributes are accessed without them. This bit of documentation might be helpful. Also, if you find it helpful, you can see the difference in implementation between name()
and pid
。
至于为什么 pid
是Process
的只读属性,而name()
需要调用方法为了获得进程名称,我不确定。事实上,pid
似乎是进程 class 上唯一的只读属性,而有关进程实例的所有其他信息都是通过方法调用检索的。就个人而言,似乎 inconsistent/non-standard 这样做,但我认为这种选择有充分的理由。我认为主要原因是 PID 不能意外更改,因为它是一个关键组件。如果 PID 是一个方法而不是只读属性,那么循环中的 eachProcess.pid = 123
会将方法更改为 int 123
,而按照当前的方式,这种尝试重新分配将引发错误相反,这样 PID 在某种意义上受到保护,而 eachProcess.name = 'foo'
可能不会引发错误。
此外,请注意,虽然它们在 Process
class 实例的字符串表示中的显示方式可能看起来像关键字参数,但 name()
和 pid
是不是关键字参数(虽然 pid
可以在创建 Process
实例时作为关键字参数传递,但这不是这里发生的事情)。
我制作了 pid
一个 class 属性 / 属性 主要是为了与 subprocess.Popen.pid
和 multiprocessing.Process.pid
stdlib 模块保持一致(threading.Thread.ident
记住)。
此外,它不需要任何计算(与 name()
、cmdline()
等相反)并且它永远不会改变,所以只读的东西当时对我来说更有意义.
这是一个 属性 而不仅仅是一个属性,只是为了在用户尝试 change/set 时出错。