You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ruamel.yaml写入配置时nameservers.addresses带引号如何解决

问题根因

你代码里两个问题导致输出不符合预期:

  • 你将nameservers.addresses字段赋值为自己拼接的f字符串f"[{dns}]",ruamel.yaml识别到该字段类型为字符串,序列化时会自动给字符串值包裹单引号,不会将其识别为YAML列表结构。
  • 输入读取逻辑没有做去空处理,输入时如果直接回车、或者首尾带空格,就会写入空字符串,对应你看到的- ''、to: ''这类无效配置。另外原代码存在多余缩进、缺失ruamel.yaml导入的语法问题。
修复方案

YAML语法中[xxx]格式的行内列表本质对应Python的list类型,不需要手动拼接方括号字符串,直接将DNS值存入Python列表传入即可。修复后的完整代码如下:

from pathlib import Path
from ruamel.yaml import YAML

eth_file = Path("/etc/netplan/01-network-manager-all.yaml")
yml = YAML()
# 配置短列表自动使用行内[]格式输出,匹配netplan的常规书写习惯
yml.default_flow_style = None
data = yml.load(eth_file)

eth = input("Enter interface name \n").strip()
addr = input("Enter IP address and mask. e.g., 8.8.8.8/8 \n").strip()
dns = input("Enter DNS \n").strip()
rts = input("Enter routes -to \n").strip()
rts1 = input("Enter routes via \n").strip()

new_ether = {eth: dict(
    addresses=[addr],
    nameservers=dict(addresses=[dns]),
    routes=[dict(to=rts, via=rts1)]
)}

data['network']['ethernets'].update(new_ether)
yml.dump(data, eth_file)
输出效果

运行后生成的对应配置段无多余单引号,符合预期:

addresses:
      - 192.168.1.10/24
      nameservers:
        addresses: [2.3.4.5]
      routes:
      - to: default
        via: 192.168.1.1

内容的提问来源于stack exchange,提问作者roXx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:54:23