C++、Qt内嵌python

本文介绍了如何在C++和Qt应用中内嵌Python。C++内嵌Python涉及设置include路径和库文件,通过g++编译,并演示了简单Python引用及导入其他模块。在Qt中,内嵌Python需要在.pro文件中正确配置includepath和libs,同时要注意避免关键字冲突。通过实例展示了从C++调用Python模块获取股票数据并写入文件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++内嵌python

python重要的路径:

/usr/local/include/python3.6m
/usr/local/bin/python3-config
/usr/local/bin/python3.6
/usr/local/bin/python3
/usr/local/bin/python3.6-config
/usr/local/bin/python3.6m
/usr/local/bin/python3.6m-config
/usr/local/lib/python3.6
/usr/local/lib/python3.6/site-packages/numpy/lib/tests/data/python3.npy
/usr/local/lib/pkgconfig/python3.pc
/usr/local/share/man/man1/python3.1
/usr/local/share/man/man1/python3.6.1
/usr/share/vim/vim74/autoload/python3complete.vim
/usr/share/doc/python-setuptools-0.6.10/docs/python3.txt
/usr/share/doc/python-setuptools-0.6.10/docs/build/html/_sources/python3.txt

在文件/usr/local/lib/pkgconfig/python-3.6.pc中给出了引用头文件和连接库文件的信息:

# See: man pkg-config
prefix=/usr/local
exec_prefix=${
   
   prefix}
libdir=${
   
   exec_prefix}/lib
includedir=${
   
   prefix}/include

Name: Python
Description: Python library
Requires: 
Version: 3.6 
Libs.private: -lpthread -ldl  -lutil -lrt
Libs: -L${
   
   libdir} -lpython3.6m
Cflags: -
### 调用Python代码的方式 为了实现Qt应用中调用Python脚本的需求,通常有几种不同的方式可以选择。一种常见做法是利用进程间通信机制(IPC),即通过启动外部Python解释器执行特定命令或脚本文件,并捕获其输出结果[^1]。 另一种更为集成的方法涉及使用嵌入式Python支持特性,在Qt应用程序内部直接运行Python解释器环境。这允许更紧密地结合两者功能,而无需依赖额外的子进程管理逻辑[^2]。 对于具体实施细节而言: - 如果采用IPC方案,则可以在Qt C++部分借助`QProcess`类来发起对外部程序(如Python可执行文件)的调用请求; - 若倾向于内嵌模式,则需关注PySide6所提供的相关接口文档说明以及官方示例项目作为参考依据; 下面给出基于这两种思路的具体实践案例供参考: #### 使用 `QProcess` 当选择这种方式时,可以通过如下所示的简化版伪代码片段展示基本流程: ```cpp #include <QCoreApplication> #include <QProcess> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString program = "python3"; QStringList arguments; arguments << "-c" << "'import sys; print(sys.version)'"; QProcess process; process.start(program, arguments); if (!process.waitForStarted()) return 1; if (!process.waitForFinished()) return 2; qDebug() << process.readAllStandardOutput(); return a.exec(); } ``` 这段代码展示了如何设置并启动一个新的Python解释器实例去执行简单的版本打印语句。 #### 嵌入 Python 解释器 针对希望更加深入整合的情况,这里提供了一个简化的例子用于演示怎样初始化Python API并在其中定义函数之后立即调用之: ```cpp // 初始化前记得链接必要的库比如 `-lpython3.8` extern "C" { #include <Python.h> } ... PyObject* pName, *pModule, *pDict, *pFunc; if (PyImport_AppendInittab("sys", NULL) == -1){ fprintf(stderr, "Error: could not extend inbuilt module table\n"); return 1; } Py_Initialize(); // 启动Python解析器 pName = PyUnicode_DecodeFSDefault("test"); // 加载模块名为 test 的py源码 pModule = PyImport_Import(pName); // 导入该模块到当前上下文中 Py_DECREF(pName); if (pModule != nullptr){ // 检查导入是否成功完成 pFunc = PyObject_GetAttrString(pModule,"hello_world"); // 获取 hello_world 函数指针 ... } else { PyErr_Print(); fprintf(stderr, "Failed to load \"%s\"\n", "test"); Py_XDECREF(pFunc); Py📐⚗📐 📐⚗📐 📐⚗📐 Clear py_module and other resources. Py_Finalize(); return 1; } ... // 执行完毕后清理资源释放内存空间 Py_Finalize(); return 0; ``` 上述代码段体现了较为底层的操作过程,实际开发过程中建议优先考虑更高层次封装好的工具集,例如前面提到过的PySide6框架下的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值