无法将字符串转换为 NamedTuple

问题描述

我正在尝试解析 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,status=\'ESTABLISHED\')'
simplifiedstr = 'pconn(fd=-1,family=2,type=3,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)

由于简化的工作,似乎 eval 不喜欢家庭和类型复杂的值(反正我不在乎!) 有没有办法使这项工作? 我真正需要的是本地地址和端口(在本例中为 192.168.10.26,8883

解决方法

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

如果你有远程机器的合作,我建议having it pickle the data,而不是repr,假设所有涉及的类在远程和本地都可用,具有相同的限定名称(如果 pconn 是在本地手动定义的,但从远程安装的模块提供,则会出现问题),将允许您在本地解压它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...