如何从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(${}
)%
- 为我的模板使用
扩展可能会令人困惑,因为autotools和CMake已经使用了此扩展李>.in
grep
这样古老的本机解决方案存在(请不要提及M4:)
我还可以使用什么解决方案用外部脚本生成的数据填充C模板?我错过了什么真正的魔法吗?这可能不是你想要的,但你知道你可以在
jinja2
中更改标签,对吗?看这里,它显示了如何更改,例如块开始_sting
和所有其他标记。是的,我知道,但mako有几个优点:有一个内置的mako渲染命令行界面,您可以直接从模板执行python代码,这在jinja中是不可能的