2015-10-20 110 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

感謝您的廣泛答覆和解釋!我現在就試試! –