如何防止 yaml-cpp 解析器删除所有注释?

2024-04-22

我有一个项目需要阅读一份详细的文档yaml文件,修改几个值,然后写回。麻烦的是yaml-cpp完全删除所有评论并“吃掉”它们。有趣的是,YAML::Emitter类允许向输出添加注释。有没有办法保留输入中的注释并将它们写回到我没有看到的库中?因为就目前情况而言,我看不到任何使用YAML::Parser类(它使用YAML::Scanner类,其中评论本身实际上被“吃掉”)。


根据YAML 规范 http://www.yaml.org/spec/1.2/spec.html#id2767100

注释是表示细节,不得对序列化树或表示图产生任何影响

因此,您需要使解析器不兼容以保留注释,如果 yaml-cpp 这样做了,它们应该在文档中明确说明。

我为Python做了这个鲁梅尔.yaml https://pypi.python.org/pypi/ruamel.yaml/。如果从 C++ 程序嵌入和调用 Python 是可以接受的,您可以执行如下操作(我在 Linux Mint 下使用 Python 3.5):

pythonyaml.cpp:

#include <Python.h>

int
update_yaml(const char*yif, const char *yof, const char* obj_path, int val)
{
    PyObject *pName, *pModule, *pFunc;
    PyObject *pArgs, *pValue;
    const char *modname = "update_yaml";
    const char *lus = "load_update_save";

    Py_Initialize();
    // add current directory to search path
    PyObject *sys_path = PySys_GetObject("path");
    PyList_Append(sys_path, PyUnicode_FromString("."));

    pName = PyUnicode_DecodeFSDefault(modname);
    /* Error checking of pName left out */

    pModule = PyImport_Import(pName);
    Py_DECREF(pName);

    if (pModule != NULL) {
        pFunc = PyObject_GetAttrString(pModule, lus);
        /* pFunc is a new reference */

        if (pFunc && PyCallable_Check(pFunc)) {
            pArgs = PyTuple_New(4);
            PyTuple_SetItem(pArgs, 0, PyUnicode_FromString(yif));
            PyTuple_SetItem(pArgs, 1, PyUnicode_FromString(yof));
            PyTuple_SetItem(pArgs, 2, PyUnicode_FromString(obj_path));
            PyTuple_SetItem(pArgs, 3, PyLong_FromLong(val));

            pValue = PyObject_CallObject(pFunc, pArgs);
            Py_DECREF(pArgs);
            if (pValue != NULL) {
                printf("Old value: %ld\n", PyLong_AsLong(pValue));
                Py_DECREF(pValue);
            }
            else {
                Py_DECREF(pFunc);
                Py_DECREF(pModule);
                PyErr_Print();
                fprintf(stderr,"Call failed\n");
                return 1;
            }
        }
        else {
            if (PyErr_Occurred())
                PyErr_Print();
            fprintf(stderr, "Cannot find function \"%s\"\n", lus);
        }
        Py_XDECREF(pFunc);
        Py_DECREF(pModule);
    }
    else {
        PyErr_Print();
        fprintf(stderr, "Failed to load \"%s\"\n", modname);
        return 1;
    }
    Py_Finalize();
    return 0;
}


int
main(int argc, char *argv[])
{
    const char *yaml_in_file = "input.yaml";
    const char *yaml_out_file = "output.yaml";
    update_yaml(yaml_in_file, yaml_out_file, "abc.1.klm", 42);
}

创建一个Makefile(将路径调整为您的Python3.5安装,需要安装头文件,如果从源代码编译则正常,否则您需要该包python3-dev安装):

echo -e "SRC:=pythonyaml.cpp\n\ncompile:\n\tgcc \$(SRC) $(/opt/python/3.5/bin/python3-config --cflags --ldflags | tr --delete '\n' | sed 's/-Wstrict-prototypes//') -o pythonyaml"  > Makefile

编译程序make.

Create update_yaml.py它将被加载pythonyaml:

# coding: utf-8

import traceback
import ruamel.yaml


def set_value(data, key_list, value):
    """key list is a set keys to access nested dict and list
    dict keys are assumed to be strings, keys for a list must be convertable to integer
    """
    key = key_list.pop(0)
    if isinstance(data, list):
        key = int(key)
    item = data[key]
    if len(key_list) == 0:
        data[key] = value
        return item
    return set_value(item, key_list, value)


def load_update_save(yaml_in, yaml_out, obj_path, value):
    try:
        if not isinstance(obj_path, list):
            obj_path = obj_path.split('.')
        with open(yaml_in) as fp:
            data = ruamel.yaml.round_trip_load(fp)
        res = set_value(data, obj_path.split('.'), value)
        with open(yaml_out, 'w') as fp:
            ruamel.yaml.round_trip_dump(data, fp)
        return res
    except Exception as e:
        print('Exception', e)
        traceback.print_exc()  # to get some useful feedback if your python has errors

Create input.yaml:

abc:
  - zero-th item of list
  - klm: -999        # the answer?
    xyz: last entry  # another comment

如果你有ruamel.yaml安装在你的python3.5中并运行./python_yaml它会打印Old value: -999,以及新文件output.yaml将包含:

abc:
- zero-th item of list
- klm: 42            # the answer?
  xyz: last entry    # another comment
  • 虽然42只有两个字符,其中-999有四个,评论仍然与其下面的一致
  • 而不是提供虚线路径abc.1.klm你可以创建一个Python列表 在 C++ 中,并将其交给load_update_save()作为第三个参数。在这种情况下,您可以使用字符串以外的其他项目的键,或者包含点的字符串的键
  • 根据您的使用情况,您可能想要更改设置整数的硬编码假设(PyLong_FromLong对于第四个参数)的值。 python 程序不需要为此更新。
  • 您可以对输入和输出使用相同的文件名,以覆盖输入。
  • it is可以使用以下命令更改 python 文件中的注释ruamel.yaml
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止 yaml-cpp 解析器删除所有注释? 的相关文章

  • WPF 中的屏幕分辨率问题?

    我将在 WPF 中使用以下代码检测分辨率 double height System Windows SystemParameters PrimaryScreenHeight double width System Windows Syste
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • 如何在 C++ 中将 CString 转换为 double?

    我如何转换CString to a double在 C 中 Unicode 支持也很好 Thanks A CString可以转换为LPCTSTR 这基本上是一个const char const wchar t 在 Unicode 版本中 知
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 为什么具有相同名称但不同签名的多个继承函数不会被视为重载函数?

    以下代码片段在编译期间产生 对 foo 的调用不明确 错误 我想知道是否有任何方法可以解决此问题而不完全限定对 foo 的调用 include
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • 分配器感知容器和propagate_on_container_swap

    The std allocator traits模板定义了一些常量 例如propagate on container copy move assign让其他容器知道它们是否应该在复制或移动操作期间复制第二个容器的分配器 我们还有propag
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp

随机推荐

  • Vue 绑定到外部对象

    我正在尝试使用 Vue 作为一个非常薄的层来将现有模型对象绑定到视图 下面是一个玩具应用程序 说明了我的问题 我有一个GainNode https developer mozilla org en US docs Web API GainN
  • 如何在 Jenkins Build Execute Shell 中运行 docker 命令

    我是詹金斯的新手 我一直在四处寻找 但找不到我要找的东西 我想知道如何在 Jenkins 中运行 docker 命令 构建 执行 Shell 例子 docker run hello world 我在 Jenkins 配置系统中将 Docke
  • 设置纵横比时 Pyplot imshow 不显示方形像素

    我在使用 Pyplot 时遇到一些问题imshow从 numpy 中绘制图像ndarray called data保持其纵横比和方形像素 的形状ndarray is 112 2182 这是我正在使用的代码 import matplotlib
  • NDS 求解波动方程时的不稳定性

    我正在尝试使用NDSolve求解波动方程 以检查使用它是否比我的旧特征方程更容易和 或更快 方法实施 我得到了很多特征方法没有得到的不稳定性 并且由于这些是简单的方程 我想知道出了什么问题 希望不是问题的物理方面 ans Flatten N
  • 如何在 ZedGraph 中同步三个 GraphPane?

    使用时ZedGraph要在三个 GraphPane 上显示六个图表 如第一张图片所示 所有图表都是同步的 但是 当我尝试显示第一个窗格的日期时 图表不同步 如第二张图片所示 重要的是所有六个图表保持同步 以便用户理解整个图表 我已经按照建议
  • MaterialApp 构建器错误:找不到覆盖小部件

    我在构建 navigationDrawer 时遇到错误 其中 tootlip 小部件需要 MaterialApp 作为祖先 这是错误的内容 I flutter 5780 TooltipState bc79e ticker inactive
  • 是否有一种简洁的方法可以使用现有数据的副本生成新线程?

    我正在尝试生成几个新线程 其中每个线程都有自己的copy某个州的 我想要的是这样的 use std thread fn main let data vec 42 10 let more data Important data to stri
  • Python 从子进程调用 raw_input

    我正在使用 subprocess 从下面的脚本中调用 python 脚本 用户从命令行使用 raw input 选择要打开的文件 import optparse import subprocess import readline impor
  • 有些人讨厌的默认 ASP.NET MVC AccountController 代码有哪些特点?

    我读过一些人的来信 西蒙 基亚雷塔 http codeclimber net nz archive 2009 10 27 12 asp net mvc best practices aspx 塞巴斯蒂安 兰布拉 http exposurer
  • pandas 列相关性具有统计显着性

    给定 pandas 数据框 df 来获取其列之间的相关性的最佳方法是什么df 1 and df 2 我不希望输出计算行数NaN which pandas内置相关性可以 但我也希望它输出pvalue或标准错误 而内置错误则不然 SciPy似乎
  • 模型中 Authlogic 的 current_user 对象

    我需要知道模型中当前用户的 ID def after save desc points nil nil if answer index daily question correct answer index desc I18n t dail
  • 无法启动 API 29 模拟器 (Android 10)

    正如标题所说 我尝试创建一个 Android 10 模拟器 当尝试启动模拟器时没有任何反应 只有手机出现在屏幕上 但设备屏幕保持黑色 我没有收到任何错误 我已经等待但没有任何反应曾经发生过 当我触摸关闭按钮时 我收到 AVD Pixel 4
  • 如何从亚马逊s3存储桶中删除文件?

    我需要用 python 编写代码 从 Amazon s3 存储桶中删除所需的文件 我可以连接到 Amazon s3 存储桶 也可以保存文件 但如何删除文件 Using boto3 当前版本1 4 4 使用S3 Object delete h
  • 致命错误:在非对象上调用成员函数 query()

    我正在使用 pdo 并且我已在配置文件中设置连接字符串 例如 db new PDO mysql host localhost dbname mydbname root pass 我在类中的方法 函数中有此查询 query db gt que
  • 硒 + 火狐 + HTTPS

    好的 我知道我问的是一个老生常谈的问题 但我发布这个问题是因为尽管尝试了各种链接上提供的所有解决方案 但我的问题仍未得到解决 我的限制 我不想使用保存的 Firefox 配置文件来保存网站的证书 Selenium 服务器版本 2 0b3 尝
  • 使用 Jadiru Joda/Hibernate 持久用户类型时出现 AbstractMethodError

    我已经向我的 MySQL TIMESTAMP 类型的用户数据库引入了一个 已创建 列 我正在尝试使用 Jadiru 的 UserType Hibernate 映射器将其映射到 Joda LocalDateTime 我正在使用 UserTyp
  • 使用 Yii STAT 进行分组聚合?

    我有一个Yii STAT 关系 http www yiiframework com doc guide 1 1 en database arr statistical query其定义是为了提供分组SUM结果 但是当我在视图中访问关系时 t
  • CTE - 递归更新数量直到消耗总量

    我一直在研究 CTE 试图确定是否可以使用订单数量递归更新库存数量记录 直到订单数量被消耗 以下是表格和记录 CREATE TABLE dbo myOrder Account float NOT NULL Item float NOT NU
  • 按主键顺序插入行更快吗?

    我有一张这样的桌子 create table stream last symbol id integer high decimal 8 2 low decimal 8 2 last decimal 8 2 volume integer la
  • 如何防止 yaml-cpp 解析器删除所有注释?

    我有一个项目需要阅读一份详细的文档yaml文件 修改几个值 然后写回 麻烦的是yaml cpp完全删除所有评论并 吃掉 它们 有趣的是 YAML Emitter类允许向输出添加注释 有没有办法保留输入中的注释并将它们写回到我没有看到的库中