适用于 Windows 7 上的 Python 3.5 64 位和 psutil 5 库。
我对如何正确访问每个类 'psutil 中提供的名称和 pid 信息感到困惑。进程"项由psutil.process_iter()返回。
以下代码返回一个类"生成器">对象:
import psutil
curProcesses = psutil.process_iter()
一个简单的循环输出每个类'psutil。该生成器中包含的进程对象:
for eachProcess in curProcesses:
print(eachProcess)
输出:
psutil.Process(pid=0, name='System Idle Process')
psutil.Process(pid=4, name='System')
... and so on ...
现在这就是我感到困惑的地方。
如果我按如下方式修改上一个循环,那么我将得到一个整数pid和一个字符串名称。
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 ...
生成的整数和字符串正是我想要的。但是,经过几次实验,我只能得到它们:
eachProcess.pid后面不跟括号 alaeachProcess.pid。(添加括号会产生TypeError:"int"对象不是可调用的异常。
eachProcess.name后跟括号ala eachProcess.name()。(删除括号将返回绑定方法 Process.name而不是字符串名称。
为什么两个关键字外观参数pid和名称的行为不同?(我怀疑我即将学习一些关于 Python 3 生成器对象非常有用的东西......
实际上并没有太多内容:pid
是只读属性(使用@property
装饰器创建),name()
是一个方法,两者都是Process
类。 方法需要调用括号才能返回数据,而属性可以在没有它们的情况下访问。这部分文档可能会有所帮助。此外,如果您觉得它有帮助,您可以看到name()
和pid
之间的实现差异。
至于为什么pid
是Process
的只读属性,而需要调用一个方法name()
才能获得进程名称,我不确定。事实上,pid
似乎是进程类上唯一的只读属性,而有关进程实例的所有其他信息都是通过方法调用检索的。就个人而言,这样做似乎不一致/不标准,但我认为这种选择是有充分理由的。我认为主要原因是PID不会意外更改,因为它是一个关键组件。如果 PID 是一个方法而不是只读属性,那么循环中的eachProcess.pid = 123
会将该方法更改为 int123
,而按照目前的方式,这种尝试重新分配将引发错误,以便 PID 在某种意义上受到保护,而eachProcess.name = 'foo'
可能会在不引发错误的情况下通过。
另外,请注意,虽然它们在类实例的字符串表示形式中的显示方式可能看起来像关键字参数Process
但name()
和pid
不是关键字参数(尽管pid
可以在创建Process
实例时作为关键字参数传递,但这不是这里发生的事情)。
我pid
类属性/属性主要是为了与subprocess.Popen.pid
保持一致,并multiprocessing.Process.pid
stdlib 模块(也想到threading.Thread.ident
)。
此外,它是不需要任何计算的东西(与name()
、cmdline()
等相反),并且它永远不会改变,所以当时只读的东西对我来说更有意义。
它是一个属性,而不仅仅是一个属性,只是在用户尝试更改/设置它时出错。