Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Python生成C代码?_Python_C_Jinja2_Template Meta Programming_Mako - Fatal编程技术网

如何从Python生成C代码?

如何从Python生成C代码?,python,c,jinja2,template-meta-programming,mako,Python,C,Jinja2,Template Meta Programming,Mako,我正在写一个嵌入式算法。目前我有硬编码的查找表: static const int32_t sine[65536] = { ... } 该算法应可在不同平台上移植,但查找表的长度会根据配置和目标平台的不同而变化 我当前的解决方案使用mako渲染(mako比Jinja2快得多),如下所示: <%! import os import algo # Local module that contains tools to generate coefs. from numpy impor

我正在写一个嵌入式算法。目前我有硬编码的查找表:

static const int32_t sine[65536] = {
    ...
}
该算法应可在不同平台上移植,但查找表的长度会根据配置和目标平台的不同而变化

我当前的解决方案使用mako渲染(mako比Jinja2快得多),如下所示:

<%!
import os
import algo  # Local module that contains tools to generate coefs.
from numpy import sin, linspace, pi

a, b, c, d, e = algo.coefficients(os.environ['ALGO_MODE'])
%>

static inline float poly(float x)
{
    return x * ( x * ( x * ( x * ${a} + ${b}) + ${c}) + ${d}) + ${e};
}

float sine[] = {
% for y in sin(linspace(0, 2 * pi, 2 ** 16)):
    ${y},
% endfor
};

静态内联浮点多边形(浮点x)
{
返回x*(x*(x*(x*${a}+${b})+${c}+${d})+${e};
}
浮点正弦[]={
%对于sin中的y(linspace(0,2*pi,2**16)):
${y},
%结束
};
在我的Makefile中,我使用以下命令:

in: $(IN)
$(IN): build/headers/%: src/%.in
    mkdir -p $(dir $@)
    PYTHONPATH=.:$$PYTHONPATH mako-render $< > $@ || true
in:$(in)
$(英寸):内部版本/头文件/%:src/%.IN
mkdir-p$(dir$@)
PYTHONPATH=.:$$PYTHONPATH mako渲染$<>$@| | true
我喜欢这个解决方案,因为我可以轻松地从Python结果生成C代码:

  • 滤波系数
  • 查找表
  • 动态类型
主要缺点是:

  • 我发现没有一个模板引擎能够很好地与C代码配合使用
    • Jinja的语法中有很多大括号,在C语言中很容易混淆
    • Mako有一个奇怪的混合语法:xml(
      )、shell(
      ${}
      )、Mako(
      %
  • 为我的模板使用
    .in
    扩展可能会令人困惑,因为autotools和CMake已经使用了此扩展
元编程/代码生成正在变得非常流行,在我的工作领域,我几乎每天都需要使用这样的魔法。我感到惊讶的是,没有其他像
grep
这样古老的本机解决方案存在(请不要提及M4:)


我还可以使用什么解决方案用外部脚本生成的数据填充C模板?我错过了什么真正的魔法吗?

这可能不是你想要的,但你知道你可以在
jinja2
中更改标签,对吗?看这里,它显示了如何更改,例如
块开始_sting
和所有其他标记。是的,我知道,但mako有几个优点:有一个内置的mako渲染命令行界面,您可以直接从模板执行python代码,这在jinja中是不可能的