在 Ubuntu 上用 C++ 调用 Python,常见有几种方式,从“简单可靠”到“高级灵活”依次是:
sudo apt update
sudo apt install python3-dev
确认 Python 版本:
python3 --version
假设有一个 Python 文件 test.py:
# test.py
def add(a, b):
return a + b
C++ 代码 main.cpp:
#include <Python.h>
#include <iostream>
int main() {
Py_Initialize();
// 添加当前路径
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
PyObject* pModule = PyImport_ImportModule("test");
if (!pModule) {
std::cerr << "Failed to load Python module\n";
return 1;
}
PyObject* pFunc = PyObject_GetAttrString(pModule, "add");
if (!pFunc || !PyCallable_Check(pFunc)) {
std::cerr << "Function not found\n";
return 1;
}
PyObject* pArgs = PyTuple_Pack(2,
PyLong_FromLong(3),
PyLong_FromLong(5));
PyObject* pResult = PyObject_CallObject(pFunc, pArgs);
long result = PyLong_AsLong(pResult);
std::cout << "Result: " << result << std::endl;
Py_DECREF(pArgs);
Py_DECREF(pResult);
Py_DECREF(pFunc);
Py_DECREF(pModule);
Py_Finalize();
return 0;
}
g++ main.cpp -o main $(python3-config --cflags --ldflags)
运行:
./main
✅ 优点:
#include <cstdlib>
int main() {
system("python3 test.py");
}
✅ 适合:
❌ 不适合:
如果你希望 Python 调用 C++,或 C++ 调用 Python 都很自然:
pip install pybind11
适合写扩展模块,但不太适合“C++ 直接调 Python 脚本”。
sudo apt install libboost-python-dev
功能强,但配置复杂,维护成本高,现在不如 pybind11 流行。
sudo apt install python3-dev
确保:
Py_InitializePyGILState_Ensure / Release| 场景 | 推荐 |
|---|---|
| C++ 调 Python 脚本 | Python C API |
| 只跑脚本 | system() |
| 双向调用 | pybind11 |
| 老项目 | Boost.Python |
如果你愿意,我可以:
你现在是想做什么类型的调用?