从环境变量读取python字典
我试图从环境变量中读取python脚本中的字典 这是我的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
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
将该字符串转换为正确的Pythondict
。谢谢@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'}]