从环境变量中读取python字典

时间:2015-10-20 17:42:27

标签: 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': '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)

这就是我如何指定环境变量(但没有将其识别为字典)

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'},  ]"

任何人都可以帮我弄清楚我错过了什么吗?在此先感谢你们

3 个答案:

答案 0 :(得分:3)

这里的json对象被表示为字符串。您现在需要使用json模块使其成为正确的Python字典。

你的json中也有一个错误,你的结尾有逗号。

此外,为了使用json模块,你应该使用双引号然后用单引号括起来。

如果要将它们设置为环境变量,我也不会看到“\”。但是,如果他们在那里,他们也将在你的字符串中:

\\\n

json模块将很难实现。在这种情况下你可以做的是,如果你真的想要那些斜杠,请确保在使用字符串上的replace方法执行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

https://docs.python.org/2/library/json.html

Python 3

https://docs.python.org/3/library/json.html

答案 1 :(得分:2)

您可以使用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)

答案 2 :(得分:1)

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

import ast
brower_dict = ast.literal_eval(brower)

ast.literal_eval比内置eval更受限制,但从不受信任的来源使用是安全的,因为它无法执行任意代码。