微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法将字符串转换为 NamedTuple

如何解决无法将字符串转换为 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 是在本地手动定义的,但从远程安装的模块提供,则会出现问题),将允许您在本地解压它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?