首页 > 解决方案 > psutil.net_connections() 应该返回 namedtuple,但它的行为不是一个

问题描述

我试图找出我的服务器(应该在 上运行127.0.0.1:5000)是否真的在运行。我试图用psutil.net_connections()它来弄清楚:

filter(lambda conn: conn.raddr.ip == '127.0.0.1' and conn.raddr.port == 5000, psutil.net_connections())

这应该给我该项目对应于我的服务器,并检查我是否真的得到了一些东西,我只需检查len(tuple(...))). 但是,使用我没有得到的tuple(...)给我,因为内部元组(即确实有一个“ip”属性)。AttributeError: 'tuple' object has no attribute 'ip'conn.raddr

定期循环时也会发生这种情况:

In [22]: for conn in psutil.net_connections():
    ...:     if conn.raddr.ip == '127.0.0.1' and conn.raddr.port == 5000:
    ...:         break
    ...: else:
    ...:     print('server is down')

但是当像这样使用它时,它可以工作!

In [23]: a=psutil.net_connections()[0]
In [24]: a.raddr.ip
Out[24]: '35.190.242.205'

psutil 版本:5.7.2

标签: pythonfilterpsutil

解决方案


并非所有人raddr都有ip属性。文档说:

raddr:远程地址作为(ip, port)命名元组或 UNIX 套接字的绝对路径。当远程端点未连接时,您将获得一个空元组(AF_INET*)""(AF_UNIX)。对于 UNIX 套接字,请参见下面的注释。

raddr因此,在尝试访问ipandport属性之前,您应该检查它是否为空。

filter(lambda conn: conn.raddr and conn.raddr.ip == '127.0.0.1' and conn.raddr.port == 5000, psutil.net_connections())

推荐阅读