gpt4 book ai didi

python - 在 C++ 中使用 jinja2 时的无效结果

转载 作者:行者123 更新时间:2023-11-28 05:07:20 29 4
gpt4 key购买 nike

我将此代码用于使用 jinja2 的 json 模板:

import json
from jinja2 import Template

def render_json(p_input_str, p_template_str, p_str):
p_input = json.loads(p_input_str)
t = Template(p_template_str)
return t.render(input=p_input, str=p_str)

临时文件:

{
"id" : "{{ input["id"] }}",
"data" : [
{% for item in input["list"] %}
{
"id" : "{{ item["id"] }}",
"value" : "{{ item["data"] }}"
},
{% endfor %}
null
],
"str" : "{{ str }}",
"ext" : "{{ input["x"] }}"
}

输入.json:

{
"id" : "1",
"list" : [ { "id" : "2", "data" : "4" } ],
"x" : "20"
}

使用 python 一切正常:

input_str=open("test.json").read()
template_str=open("temp.json").read()
print render_json(input_str, template_str, "1234")

输出:

{
"id" : "1",
"data" : [

{
"id" : "2",
"value" : "4"
},

null
],
"str" : "1234",
"ext" : "20"
}

但是当我尝试从 C++ 调用 render_json 时,input_str 被添加到输出中:

{
"id" : "1",
"list" : [ { "id" : "2", "data" : "4" } ],
"x" : "20"
}
{
"id" : "1",
"data" : [

{
"id" : "2",
"value" : "4"
},

null
],
"str" : "1234",
"ext" : "20"
}

这是我用于嵌入 python 的 C++ 代码:它基于 python 文档 Embedding Python in Another Application

int main(int argc, char *argv[])
{
std::stringstream buffer;
std::ifstream t;

t.open("test.json");
buffer << t.rdbuf();
std::string input_str = buffer.str();
t.close();
buffer.clear();

t.open("temp.json");
buffer << t.rdbuf();
std::string template_str = buffer.str();

std::vector<std::string> x = {input_str, template_str, "1234"};

PyObject *pName, *pModule, *pDict, *pFunc;
PyObject *pArgs, *pValue;

if (argc < 3)
{
printf("Usage: exe_name python_source function_name\n");
return 1;
}

Py_Initialize();
pName = PyString_FromString(argv[1]);
/* Error checking of pName left out */

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

if (pModule != NULL)
{
pFunc = PyObject_GetAttrString(pModule, argv[2]);
/* pFunc is a new reference */

if (pFunc && PyCallable_Check(pFunc))
{
pArgs = PyTuple_New(3);
for (int i = 0; i < 3; ++i)
{
pValue = PyString_FromString(x[i].c_str());
if (!pValue)
{
Py_DECREF(pArgs);
Py_DECREF(pModule);
fprintf(stderr, "Cannot convert argument\n");
return 1;
}
/* pValue reference stolen here: */
PyTuple_SetItem(pArgs, i, pValue);
}
pValue = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs);
if (pValue != NULL)
{
printf("Result of call: %s\n", PyString_AsString(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", argv[2]);
}
Py_XDECREF(pFunc);
Py_DECREF(pModule);
}
else
{
PyErr_Print();
fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);
return 1;
}
Py_Finalize();
return 0;
}

最佳答案

很确定这与您对 input_str 的构造有关和 template_str来自同一个std::stringstream与您的 python 或绑定(bind)无关。也就是说,如果您只是打印 template_str在调用你的 python 之前,你会看到它已经input_str 的内容在一开始。

std::stringstream::clear并没有按照您的想法去做——它只是继承自 ios_base并清除错误标志

只需使用第二个缓冲区。 (或调用 buffer.str("") ,我认为做你真正想要的,但它可能不值得降低可读性。)

关于python - 在 C++ 中使用 jinja2 时的无效结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44383214/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com