安装
开始之前,您需要使用pip安装cppimport。在您的终端或命令提示符中执行以下命令:
pip install cppimport
快速示例
接下来,让我们通过一个简单的示例,展示如何使用cppimport和pybind11从Python中导入并使用C++文件。
创建C++代码
首先,创建一个名为 somecode.cpp
的C++文件,并添加以下代码:
// cppimport
#include <pybind11/pybind11.h>
namespace py = pybind11;
int square(int x) {
return x * x;
}
PYBIND11_MODULE(somecode, m) {
m.def("square", &square);
}
/*
<%
setup_pybind11(cfg)
%>
*/
导入并使用C++代码
现在,在Python解释器中导入C++扩展:
import cppimport.import_hook
import somecode
# 调用C++函数从Python
somecode.square(9)
您将看到输出 81
,这证明了C++函数 square
已成功从Python中调用。
** 您已经通过cppimport和pybind11将C++代码集成到了Python中。
详细解析
顶部的注释
注释行 // cppimport
是关键的,因为它告诉cppimport,接下来的代码片段应作为Python扩展模块进行编译和导入。如果缺少此注释,cppimport将不会识别这些代码作为可能要导入的扩展。
主要逻辑
您C++代码的核心应该类似于一个标准的pybind11
扩展模版:导入pybind11
头文件,并定义您想要在Python中暴露的函数(如 square
)。
配置块
在somecode.cpp
文件的末尾,有一个配置块:
/*
<%
setup_pybind11(cfg)
%>
*/
此块在构建过程中由cppimport作为Python代码进行评估,允许指定编译器和链接器参数、依赖关系和其他配置细节,以满足编译过程的需要。
生产环境构建
在生产环境中,您可能不希望每次都手动编译C++代码。针对此问题,cppimport提供了一个命令行工具来进行预编译:
python -m cppimport build
此命令将编译当前目录及其子目录中的所有.c
和.cpp
文件,前提是这些文件包含// cppimport
注释(如果已正确设置配置)。
生产环境优化
跳过校验码和二进制存在检查
为了优化启动性能,您可以配置cppimport跳过这些检查:
cppimport.settings['release_mode'] = True
警告:在发布模式下确保所有必要的二进制文件已预先编译,否则导入缺失的文件会导致异常。
常见问题
到底发生了什么?
cppimport简化了将C++功能集成到Python应用程序的过程,自动化了编译步骤,允许您在不需手动重新编译的情况下同时编辑Python和C++文件,提高开发效率。
cppimport每次导入模块时都会重新编译吗?
在第一次导入模块时才会进行编译。之后的导入不会重新编译,但会检查C++源文件或依赖项的变化,以确保模块保持最新状态。
如何在一个扩展中使用多个源文件?
您可以在配置块中通过将多个源文件列在cfg['sources']
下,来指定多个源文件。
如何强制重新编译,即使检查码匹配?
通过设置:
cppimport.settings['force_rebuild'] = True
我可以获取更详细的输出信息吗?
是的,您可以配置日志输出,以提供更多信息,例如添加日志处理器到根日志程序或cppimport日志程序。
如何强制重新编译,无论检查码如何?
通过设置force_rebuild
为True
在配置或直接在Python代码中。
总结
cppimport是一个强大的工具,允许您从Python直接导入C++文件,提高性能并改善工作流程效率。通过结合cppimport、pybind11和cffi的力量,开发人员可以直接在Python中集成现有的C/C++库或编写关键性能函数,从而提升应用程序性能并提高开发生产力。
项目地址:https://github.com/tbenthompson/cppimport