在CentOS系统中,C++和Python可以通过多种方式进行交互。以下是一些常见的方法:
Python提供了一个C API,允许C++代码直接调用Python函数或创建Python对象。
g++
编译C++代码,并链接Python库。// example.cpp
#include <Python.h>
int main(int argc, char *argv[]) {
Py_Initialize();
PyObject *pName = PyUnicode_FromString("example_script");
PyObject *pModule = PyImport_Import(pName);
Py_DECREF(pName);
if (pModule != NULL) {
PyObject *pFunc = PyObject_GetAttrString(pModule, "hello");
if (pFunc && PyCallable_Check(pFunc)) {
PyObject_CallObject(pFunc, NULL);
} else {
PyErr_Print();
}
Py_DECREF(pFunc);
Py_DECREF(pModule);
} else {
PyErr_Print();
}
Py_Finalize();
return 0;
}
# example_script.py
def hello():
print("Hello from Python!")
g++ -I/usr/include/python3.6m -lpython3.6 example.cpp -o example
./example
Cython是一种编程语言,它结合了Python和C的特性,可以将Python代码转换为C代码,然后编译成共享库。
安装Cython:
pip install cython
编写Cython代码:创建一个.pyx
文件,编写Cython代码。
创建setup.py文件:编写一个setup.py
文件来编译Cython代码。
编译Cython代码:使用python setup.py build_ext --inplace
命令编译Cython代码。
在Python中导入编译后的模块:在Python脚本中导入编译后的模块并使用。
# example.pyx
def hello():
print("Hello from Cython!")
# setup.py
from setuptools import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("example.pyx")
)
python setup.py build_ext --inplace
import example
example.hello()
PyBind11是一个轻量级的头文件库,用于将C++代码暴露给Python。
安装PyBind11:
pip install pybind11
编写C++代码:使用PyBind11编写C++代码,暴露C++函数给Python。
编译C++代码:使用g++
编译C++代码,并链接PyBind11库。
在Python中导入编译后的模块:在Python脚本中导入编译后的模块并使用。
// example.cpp
#include <pybind11/pybind11.h>
namespace py = pybind11;
void hello() {
std::cout << "Hello from C++!" << std::endl;
}
PYBIND11_MODULE(example, m) {
m.def("hello", &hello, "A function that prints 'Hello from C++!'");
}
g++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) example.cpp -o example$(python3-config --extension-suffix)
import example
example.hello()
SWIG(Simplified Wrapper and Interface Generator)是一个软件开发工具,可以从C/C++代码自动生成Python接口。
安装SWIG:
sudo yum install swig
编写C++代码:编写C++代码,并创建一个SWIG接口文件(.i
文件)。
生成包装代码:使用SWIG生成包装代码。
编译包装代码:使用g++
编译生成的包装代码和C++代码。
在Python中导入编译后的模块:在Python脚本中导入编译后的模块并使用。
// example.cpp
#include <iostream>
void hello() {
std::cout << "Hello from C++!" << std::endl;
}
// example.i
%module example
%{
#include "example.cpp"
%}
void hello();
swig -python -py3 example.i
g++ -c example.cpp example_wrap.cxx -I/usr/include/python3.6m
g++ -shared example.o example_wrap.o -o _example.so
import example
example.hello()
以上是几种常见的C++与Python交互的方法,每种方法都有其优缺点,可以根据具体需求选择合适的方法。