【发布时间】:2019-06-20 21:42:09
【问题描述】:
最近 Ubuntu 开始提供 netplan。它需要 yaml 配置来设置网络接口。因此,例如它需要以下 yaml 来设置 WiFi:
network:
version: 2
renderer: NetworkManager
wifis:
interface_name:
access-points:
"apn":
password: "pwd"
nameservers:
addresses: [8.8.4.4, 8.8.8.8]
dhcp4: true
注意在 access-points 下,network_ssid_name (apn) 和密码字段 (pwd) 的值用双引号括起来。
我查看堆栈溢出发现this
但是,此解决方案需要从 pip 调用 ruamel.yaml 安装一个模块。我想使用我的 python 发行版中已经提供的 PyYAML 模块来实现这一点。
以下是我目前尝试过的一些事情:
import yaml
d = {'network': {'version': 2, 'renderer': 'NetworkManager', 'wifis':{'wlp58s0': {'access-points': {b'apn': {'password': b'pwd'}}}}}}
with open('/home/edyza/result.yml', 'w') as yaml_file:
yaml.dump(d, yaml_file, default_flow_style=False, default_style=None)
这个的输出是
network:
renderer: NetworkManager
version: 2
wifis:
wlp58s0:
access-points:
apn:
password: pwd
现在我尝试使用转义字符和其他一些东西,例如
import yaml
d = {'network': {'version': 2, 'renderer': 'NetworkManager', 'wifis':{'wlp58s0': {'"access-points"': {'apn': {'password': "\"pwd\""}}}}}}
with open('/home/edyza/result.yml', 'w') as yaml_file:
yaml.dump(d, yaml_file, default_flow_style=False, default_style=None)
然后输出变为
network:
renderer: NetworkManager
version: 2
wifis:
wlp58s0:
'"access-points"':
apn:
password: '"pwd"'
在不使用第三方模块的情况下,我可以进行哪些更改以在适当的键和值处使用双引号实现所需的输出?
或者我应该考虑另一种方法来生成 yaml 文件。
【问题讨论】:
-
我很确定 Python 2.7 或 3.x、
ruamel.yaml、PyYAML 或 PySyck 都没有附带 YAML 模块(两者都只支持过时十年或更长时间的 YAML 版本前)。请提供参考(例如在 Python 存储库中)什么是*默认随 python 提供的 yaml 模块,以便我们知道您指的是什么。 -
@Anthon 你是对的。我刚刚做了一个“导入 yaml”,并假设 yaml 默认随 python 一起提供。这是不正确的。我将更新问题以反映这一点。我正在使用 PyYAML。