boost.python的嵌入
将Python嵌入C++项目时,boost.python对嵌入式支持有限,需结合PythonCAPI。在Python3.3下通过PyImport_AppendInittab注册模块实现嵌入,但不同版本间API差异较大,需针对具体版本调整初始化流程与模块注册细节。
Python 这门脚本语言,用起来确实顺手。最近琢磨着把 Python 嵌入到自己的项目里,结果一上手就发现,原生的 Python C API 接口实在太多,光看函数声明就让人头皮发麻,还是得依赖成熟的第三方库来兜底。
目前名气最大的自然是 boost.python,于是下载了 boost.1.55.0,里面自带 boost.python 2.0。接下来挑 Python 版本,现在主流还是 2.5~2.7,几乎每个 Linux 发行版和大量软件都用这个范围,而 Python 3.x 还没铺开。对比了一下 Python 2 和 Python 3 的差异,犹豫了一会,最后还是决定体验高版本,选了 Python 3.3。
接着就是编译 boost.python(环境:Windows 7 x64)。这里碰了个小坑:boost 的编译器 bjam 会根据环境变量 %PATH% 中 python.exe 所在的目录来确定依赖的 Python 头文件和库的路径。路径设好后顺利编译通过,写了个小测试程序,一切正常。
不过,翻了一遍文档才发现,boost.python 目前对“做 Python 扩展库”支持得非常到位,但对“嵌入式应用”的支持却少得可怜。文档直接说支持有限,还得配合 Python C API 使用,顺便提了一句“以后可能会更好”(嗯,当下肯定是等不及了)。所以最后还是得回头仔细啃 Python C API。
大约研究了一天,网上搜到一些帖子,说用 boost.python 也可以嵌入。跟着试了一下,没成功——因为帖子用的是 Python 2.x,而手头是 Python 3.3,细节上有差异,但思路是通的。关键代码大致长这样:
char const* greet() { return "hello, world"; }
BOOST_PYTHON_MODULE(hello) {
def("greet", greet);
}
int testX() {
PyImport_AppendInittab("hello", PyInit_hello);
Py_Initialize();
// 接下来可以调用 Python 脚本
// PyRun_File() ...
Py_Finalize();
}
这里的 BOOST_PYTHON_MODULE(hello) 会生成一个 PyInit_hello 函数,返回 PyObject *,也就是一个 module。Python 3 下用 PyImport_AppendInittab() 注册这个 module,然后在之后的 PyRun_File() 里就可以正常 import hello,调用 greet() 方法了。
今天先记到这里——希望后续能把实际项目中的经验慢慢积累下来。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















