无法将字符串转换为NamedTuple

2024-09-27 07:27:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试解析NamedTuple的字符串代表,以获取psutil库(process.connections())远程生成的连接参数

字符串如下所示:

pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip=\'192.168.10.26\', port=23368), raddr=addr(ip=\'1.2.3.4\', port=8883), status=\'ESTABLISHED\')

问题是,如果我声明NamedTuple,然后使用eval构建它,它将无法解析字符串

以下是一些示例代码:

from collections import namedtuple
from socket import AddressFamily, SocketKind

inputstr = 'pconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip=\'192.168.10.26\', port=23368), raddr=addr(ip=\'1.2.3.4\', port=8883), status=\'ESTABLISHED\')'
simplifiedstr = 'pconn(fd=-1, family=2, type=3, laddr=addr(ip=\'192.168.10.26\', port=23368), raddr=addr(ip=\'1.2.3.4\', port=8883), status=\'ESTABLISHED\')'

pconn = namedtuple('pconn', 'fd family type laddr raddr status')
addr = namedtuple('addr', 'ip port')


# Simplified works
conn1 = eval (simplifiedstr)
print(conn1)

# input does not
conn2 = eval( inputstr)
print(conn2)

因为simplified可以工作,所以eval似乎不喜欢族和类型的复杂值(反正我也不在乎!) 有没有办法让这一切顺利进行? 我真正需要的是本地地址和端口(在本例中192.168.10.26, 8883


Tags: 字符串ipporttypestatusevalfamilyaddr
1条回答
网友
1楼 · 发布于 2024-09-27 07:27:47

您的基本问题是并非Python中的所有repr都遵循这些准则;有时,它们生成的字符串版本无法eval复制原始值。这里没有一个简单的解决方案可以在没有远程机器的协作的情况下工作(没有这种协作,您就无法编写自己的解析器)

如果您确实与远程计算机合作,我建议having it ^{} the data,而不是reprit,假设所有涉及的类在远程和本地都可用,并且具有相同的限定名称(如果pconn在本地手动定义,但从远程安装的模块提供,这将是一个问题),将允许您在本地取消勾选

相关问题 更多 >

    热门问题