2015-10-20 109 views
1

我想从环境变量中读取我的python脚本中的字典。从环境变量中读取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'}, ]" 

任何人都可以帮助我搞清楚我错过了什么?在此先感谢球员

+0

在'TESTING_BROWSERS'反斜线是不必要的;换行符嵌入在没有它们的引用字符串中。 – chepner

回答

1

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

简单,有用,重要。它完美的工作,谢谢。我唯一担心的是...... :(如果你告诉我问题在于被视为字符串而不是字典,那就太棒了!谢谢! –

0

它被认为是一个字符串。您需要将其评估为Python代码才能从中创建字典。

import ast 
brower_dict = ast.literal_eval(brower) 

ast.literal_eval较为有限比内置eval,但它是安全的来源不可靠的使用,因为它不能执行任意代码。

+2

'eval'通常是不好的做法。看看http://stackoverflow.com/questions/1832940/is-using-eval-in-python-a-bad-practice – Wondercricket

+0

@Wondercricket我已经改变它为'ast.literal_eval' –

+1

它的工作完美无瑕,格拉西亚斯阿尔瓦罗! –

2

你的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

相反,JSON对象*是一个字符串;您需要使用'json.loads'将该字符串转换为适当的Python'dict'。 – chepner

+0

Thanks @chepner。我更正了我的措辞并修复了一些误导性的引用。如果你看到其他东西关闭 – idjaw

+0

感谢您的广泛答复和解释!我现在就试试! –