Python的官方解释器CPython是用C语言编写,它提供了强大的C API,使得Python可以扩展和嵌入C和C++代码。这种互操作性主要通过以下机制实现:
Python/C API:
- Python解释器提供了一组C API,允许开发者编写C或C++扩展模块。这些模块可以像普通的Python模块一样被导入和使用。通过这些API,开发者可以创建新的Python对象、调用Python函数、管理Python内存等。
嵌入Python解释器:
- 开发者可以在C或C++应用程序中嵌入Python解释器,允许C或C++代码调用Python代码。通过这种方式,C或C++程序可以利用Python的灵活性和强大的库,同时保持高性能计算的优势。
C++中调用Python
在C++中调用Python脚本有多种方法,以下是其中几种常用的方法:
使用系统调用
你可以使用C++的系统调用函数来执行Python脚本。例如:
#include <cstdlib>int main() {// 使用系统调用执行Python脚本system("python3 script.py");return 0;
}
使用Python/C API
Python提供了C API,可以让你在C++代码中嵌入和执行Python代码。这种方法比较灵活,但也更复杂。以下是一个简单的例子:
#include <Python.h>int main() {// 初始化Python解释器Py_Initialize();// 执行一个简单的Python脚本PyRun_SimpleString("print('Hello from Python!')");// 导入并执行一个Python脚本文件FILE* fp = fopen("script.py", "r");if (fp != NULL) {PyRun_SimpleFile(fp, "script.py");fclose(fp);}// 关闭Python解释器Py_Finalize();return 0;
}
//如果报failed to get the Python codec of the filesystem encoding之类的错误,
//需要添加PYTHONHOME,PYTHONPATH环境变量
使用pybind11库
pybind11是一个轻量级的头文件库,可专门用于在C++中嵌入Python。以下是一个简单的例子:
#include <pybind11/embed.h>namespace py = pybind11;int main() {// 初始化Python解释器py::scoped_interpreter guard{};// 执行Python代码py::exec("print('Hello from Python!')");// 导入并执行一个Python脚本文件py::eval_file("script.py");return 0;
}