如何解决无法将字符串转换为 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 举报,一经查实,本站将立刻删除。