自动导入YAML变量?
问题描述:
我已经提供了下面的代码。我只是想知道,如果有更好的,更简洁,方式加载整个索引变量,而不是手动指定每一个...自动导入YAML变量?
Python代码
script_dir = os.path.dirname(__file__)
file_path = os.path.join(script_dir, 'config.yaml')
with open(file_path, 'r') as stream:
index = 'two'
load = yaml.load(stream)
USER = load[index]['USER']
PASS = load[index]['PASS']
HOST = load[index]['HOST']
PORT = load[index]['PORT']
...
YAML配置
one:
USER: "john"
PASS: "qwerty"
HOST: "127.0.0.1"
PORT: "20"
two:
USER: "jane"
PASS: "qwerty"
HOST: "196.162.0.1"
PORT: "80"
答
Assing到globals()
:
import yaml
import os
script_dir = os.path.dirname(__file__)
file_path = os.path.join(script_dir, 'config.yaml')
index = 'two'
with open(file_path, 'r') as stream:
load = yaml.safe_load(stream)
for key in load[index]:
globals()[str(key)] = load[index][key]
print(USER)
print(PORT)
这给:
jane
80
的几个注意事项:
- 使用全局变量通常被认为是不好的做法
- 正如评论注意到
a p
,这可能会导致问题如带有影子内置的键 - 如果您必须使用PyYAML,则应使用
safe_load()
。 -
您应该考虑使用
ruamel.yaml
(免责声明:我是包的作者),在那里你可以得到相同的结果:import ruamel.yaml yaml = ruamel.yaml.YAML(typ='safe')
,然后再次使用
load = yaml.load(stream)
(这是安全的)。
+1
请注意,这可能会造成问题,因为它会影响内建结果以及True和False等内容。 –
+0
您的回答很有帮助!我也会检查你的包装。感谢您的回复:) –
的可能的复制[解析在Python YAML文件,以及访问该数据?](https://*.com/questions/8127686/parsing-a-yaml-file-in-python-and-访问数据) –
尝试使用https://pyyaml.org/wiki/PYYAMLDocumentation – thatrockbottomprogrammer
这提供了一个当前如何设置我的代码的示例。换句话说,我希望程序自动导入所有变量。 –