สร้างไฟล์ YAML จาก python ด้วยคีย์และค่าบางค่าพร้อมเครื่องหมายคำพูดคู่

ล่าสุด 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

ประกาศภายใต้จุดเข้าใช้งาน network_ssid_name (apn) และค่าของฟิลด์รหัสผ่าน (pwd) อยู่ในเครื่องหมายคำพูดคู่

ฉันมองไปรอบๆ เกี่ยวกับสแต็กล้นและพบสิ่งนี้

อย่างไรก็ตาม โซลูชันนี้จำเป็นต้องติดตั้งโมดูลจาก pip call ruamel.yaml ฉันต้องการบรรลุเป้าหมายนี้โดยใช้โมดูล 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


person A Saxena    schedule 20.06.2019    source แหล่งที่มา
comment
ฉันค่อนข้างแน่ใจว่าไม่มีโมดูล YAML ที่มาพร้อมกับ Python 2.7 หรือ 3.x ไม่ว่าจะเป็น ruamel.yaml หรือ PyYAML หรือ PySyck (ทั้งสองโมดูลรองรับเฉพาะ YAML เวอร์ชันที่ล้าสมัยเมื่อสิบปีก่อนหรือมากกว่านั้น) โปรดระบุข้อมูลอ้างอิง (เช่น ในพื้นที่เก็บข้อมูล Python) ว่า *โมดูล yaml ที่จัดส่งเป็นค่าเริ่มต้นด้วย python` คืออะไร เพื่อให้เรารู้ว่าคุณหมายถึงอะไร   -  person Anthon    schedule 23.06.2019
comment
@Anthon คุณพูดถูก ฉันเพิ่งทำการนำเข้า yaml และถือว่า yaml จัดส่งเป็นค่าเริ่มต้นด้วย python นั่นไม่ถูกต้อง ฉันจะอัปเดตคำถามเพื่อสะท้อนให้เห็นว่า ฉันใช้ PyYAML   -  person A Saxena    schedule 24.06.2019


คำตอบ (1)


ใน YAML สตริงเครื่องหมายคำพูดไม่จำเป็น ยกเว้นในกรณีพิเศษ (หากสตริงขึ้นต้นด้วยอักขระพิเศษ หากมีอักขระควบคุมหรือ :<SPACE>)

เพื่อเป็นข้อมูลอ้างอิง ฉันขอแนะนำ บทความเกี่ยวกับการอ้างอิง YAML หรือไม่

ฉันคิดว่าไม่น่าเป็นไปได้ที่ตัวแยกวิเคราะห์ YAML ของ netplan ต้องการคำพูดเหล่านั้นจริงๆ คุณได้ลองโดยไม่มีเครื่องหมายอัญประกาศแล้วและได้รับข้อผิดพลาดหรือไม่?

person tinita    schedule 16.07.2019