4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
热卖商品
新闻详情
类字典字符串的eval-vs-json转换和解析 - 问答 - Python中文网
来自 : www.cnpython.com/qa/537... 发布时间:2021-03-25
类字典字符串的eval-vs-json转换和解析 - 问答 - Python中文网 Python中文网 - 问答频道, 解决您学习工作中的Python难题和Bug Python常见问题登录 新用户注册 \"Python中文网\"首 页问题库教程文章问答专家标签库课程中心 类字典字符串的eval-vs-json转换和解析

2021-03-24 15:36:08 发布

您现在位置:Python中文网/ 问答频道 /正文86651 3\"用户头像\"

网友

男|程序猿一只,喜欢编程写python代码。

我的上一个python项目已经有一段时间了,所以我有点生疏了--请随时提供任何建议或批评--所以我有一些关于eval和JSON的问题。在

对于这个项目,我仅限于Python2.6默认库——我试图解析用于LDAP身份验证的基于Linux的专有应用程序的数据库内容。用于查询数据库的特定命令并不十分重要,但我使用以下方法返回包含的输出:

process = subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE)stdout = process.communicate()[0]

输出:

^{pr2}$

**我看到一篇帖子,指出shell=True可能有某些安全隐患,我想知道是否有更好的解决方案?

利用ast.literal_eval和{}我已经能够成功地解析单个密钥对,但是我觉得我的多级转换是不必要的,并且相信有更好的方法吗?在

def ldap_data(stdout): # evaluate object and return usable \'ldap_data\' as dictionary _data = ast.literal_eval(stdout)[0][\'ldap_data\'] return json.loads(_data)ldap_data(stdout)[\'roles\']

最后,当我开始这个项目时,我从来没有想过用户可能有多个ldap配置,这取决于各个部署需求,因此,我从未真正考虑过如何解析每个dictionary实例。考虑到这个解决方案遇到的路障数量,我希望有人能帮助设计一个利用上面输出的索引的解决方案。在

我很抱歉问了这么多,我相信我只是想得太多了,我期待着学习我可以做些什么来提高。提前感谢您的帮助!在

1条回答网友1楼 ·

通常,当使用subprocess运行单个命令时,如果将命令名和每个选项设置为单独的字符串,则不需要shell=True,即

[\'cmd\', \'arg1\', \'arg2\']

您需要shell=True来执行shell内部的命令,或者使用其他shell功能,如the docs中所述,但这不是问题所在。在

对于解析该数据,您不需要来执行此操作,但您确实需要修改引号以使该数据成为有效的JSON。这可以通过转义现有的双引号,然后将单引号转换为双引号来完成。一旦修复的数据使用json.loads解析成Python列表,您需要再次调用json.loads来提取LDAP字典。在

^{pr2}$

输出

{ \"bind_dn\": \"CN=Bind,OU=Users,DC=example,DC=com\",  \"bind_pw\": \"xxxxxxxx\",  \"ca_cert_file\": null,  \"cache_expire\": 86400,  \"roles\": [ \"admin:CN=SuperUsers,DC=example,DC=com\",  \"read_only:CN=Users,DC=example,DC=com\" \"search_base\": \"OU=Users,DC=example,DC=com\",  \"search_filter\": \"(sAMAccountName={username})\",  \"server_url\": [ \"ldap://ad.example.com\",  \"ldaps://ad.example.com:3001\" \"timeout\": 1500,  \"user_to_dn_rule\": \"{username}@example.com\" \"bind_dn\": \"CN=Bind,OU=Users,DC=example,DC=com\",  \"bind_pw\": \"xxxxxxxx\",  \"ca_cert_file\": null,  \"cache_expire\": 86400,  \"roles\": [ \"admin:CN=SuperUsers,DC=example,DC=com\" \"search_base\": \"OU=Users,DC=example,DC=com\",  \"search_filter\": \"(sAMAccountName={username})\",  \"server_url\": [ \"ldap://169.254.0.1\" \"timeout\": 1500,  \"user_to_dn_rule\": null

在Python2.6.6上测试

注意,ldap字典中的键(和值字符串)是Unicode字符串,而JSON转储中表示为null的值实际上是None。在

相关问题

本文链接: http://evalca.immuno-online.com/view-723153.html

发布于 : 2021-03-25 阅读(0)
公司介绍
品牌分类
联络我们
服务热线:4000-520-616
(限工作日9:00-18:00)
QQ :1570468124
手机:18915418616