从环境变量读取python字典

从环境变量读取python字典,python,bash,Python,Bash,我试图从环境变量中读取python脚本中的字典 这是我的python脚本的代码: desired_cap_default = [ {'platform': 'Windows 7', 'browserName': 'firefox', 'version': '24.0'}, {'platform': 'OS X 10.10', 'browserName': 'chrome', 'version': '45.0'}, {'platform': 'W

我试图从环境变量中读取python脚本中的字典

这是我的python脚本的代码:

  desired_cap_default = [
        {'platform': 'Windows 7', 'browserName': 'firefox', 'version': '24.0'},
        {'platform': 'OS X 10.10', 'browserName': 'chrome', 'version': '45.0'},
        {'platform': 'Windows XP', 'browserName': 'chrome', 'version': '40.0'},
        {'platform': 'OS X 10.10', 'browserName': 'safari', 'version': '8.0'},
        # {'platform': 'Windows XP', 'browserName': 'firefox', 'version': '10.0', 'screenResolution': '1600x1200',
        # 'videoUploadOnPass': False, 'commandTimeout': 120}
    ]

browser = os.getenv('TESTING_BROWSERS', desired_cap_default)
这就是我指定环境变量的方式(但没有将其识别为字典)


有人能帮我弄清楚我错过了什么吗?提前感谢各位

它被识别为字符串。您需要将其作为python代码进行评估,以便从中创建字典

import ast
brower_dict = ast.literal_eval(brower)

ast.literal\u eval
比内置的
eval
更受限制,但它可以从不受信任的来源安全地使用,因为它不能执行任意代码。

您可以使用
ast
模块进行此操作

TESTING_BROWSERS = "[{'platform': 'Windows 7', 'browserName': 'firefox', 'version': '24.0'}, \
{'platform': 'OS X 10.10', 'browserName': 'chrome', 'version': '45.0'}, \
{'platform': 'Windows XP', 'browserName': 'chrome', 'version': '40.0'}, \
{'platform': 'OS X 10.10', 'browserName': 'safari', 'version': '8.0'},  ]"

import ast
my_dict = ast.literal_eval(TESTING_BROWSERS)

这里的json对象表示为字符串。现在需要使用json模块使其成为一个合适的Python字典

您的json中也有一个错误,结尾处有一个逗号

此外,为了使用json模块实现这一点,应该使用双引号,然后用单引号括起来

如果将“\”设置为环境变量,我也不认为有必要使用“\”。但是,如果它们存在,它们也将出现在您的字符串中,如下所示:

\\\n
json模块将很难做到这一点。在这种情况下,您可以做的是,如果您真的想在其中添加这些斜杠,请确保在对字符串执行
json.loads
命令之前删除它们。实际上,你可以这样做:

browser = json.loads(os.getenv('TESTING_BROWSERS', v).replace("\\\n", ""))
下面是两个例子。一个是我对json所做的修改,删除了斜杠,另一个没有删除:

import json
a = '[{"platform": "Windows 7", "browserName": "firefox", "version": "24.0"}, {"platform": "OS X 10.10", "browserName": "chrome", "version": "45.0"}, {"platform": "Windows XP", "browserName": "chrome", "version": "40.0"}, {"platform": "OS X 10.10", "browserName": "safari", "version": "8.0"}]'
print(json.loads(a))
输出:

[{u'platform': u'Windows 7', u'browserName': u'firefox', u'version': u'24.0'}, {u'platform': u'OS X 10.10', u'browserName': u'chrome', u'version': u'45.0'}, {u'platform': u'Windows XP', u'browserName': u'chrome', u'version': u'40.0'}, {u'platform': u'OS X 10.10', u'browserName': u'safari', u'version': u'8.0'}]
现在,斜线已经准备好了

请记住,正如我所提到的,您至少必须先修复引号并删除逗号

>>> import json
>>> browser = json.loads(os.getenv('TESTING_BROWSERS', v).replace("\\\n", ""))
>>> print(browser)
[{u'platform': u'Windows 7', u'browserName': u'firefox', u'version': u'24.0'}, {u'platform': u'OS X 10.10', u'browserName': u'chrome', u'version': u'45.0'}, {u'platform': u'Windows XP', u'browserName': u'chrome', u'version': u'40.0'}, {u'platform': u'OS X 10.10', u'browserName': u'safari', u'version': u'8.0'}]
以下是关于json模块的信息:

Python 2

Python 3


eval
通常是不好的做法。看看@Wondercricket,我把它改成了
ast.literal\u eval
,相反,JSON对象是一个字符串;您需要使用
json.loads
将该字符串转换为正确的Python
dict
。谢谢@chepner。我纠正了我的措辞,并修正了其他一些误导性的引用。干杯如果你碰巧再看一眼,请告诉我你还有什么要看的。谢谢你的回答和解释!我现在就去试试!
测试浏览器中的反斜杠是不必要的;换行符嵌入在带引号的字符串中,没有换行符。简单、有用且切中要害。它工作得很好,谢谢。我唯一关心的是…:(如果你告诉我问题是它被视为字符串而不是dict,那就太棒了!非常感谢你!
>>> import json
>>> browser = json.loads(os.getenv('TESTING_BROWSERS', v).replace("\\\n", ""))
>>> print(browser)
[{u'platform': u'Windows 7', u'browserName': u'firefox', u'version': u'24.0'}, {u'platform': u'OS X 10.10', u'browserName': u'chrome', u'version': u'45.0'}, {u'platform': u'Windows XP', u'browserName': u'chrome', u'version': u'40.0'}, {u'platform': u'OS X 10.10', u'browserName': u'safari', u'version': u'8.0'}]