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(...)会给我AttributeError: 'tuple' object has no attribute 'ip',因为内部元组(即conn.raddr确实有一个“ ip”属性),所以我没有得到。

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

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

解决方法

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

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

因此,在尝试访问raddrip属性之前,应检查port是否为空。

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