QT C++调用Python Py_Initialize 出错

本文介绍了一种解决Py_Initialize未定义引用错误的方法,确保Qt和Python版本匹配,并提供了详细的配置步骤。

(先提醒一句,如果你用的python需要用到tensorflow的,还是别看了,下面装的是32位的python , 但是qt我又只能用32位的mingW版,这两个能兼容,可以运行。但是我python里面又要用到tensorflow,而tensorflow现在不支持32位的python,还在尝试把他配置好,你们如果有解决办法,麻烦推荐给我,但你如果python不用tensorflow的话,就不用理会前面这段话了,往下看吧)

哎,刚解决了一个困扰我两天的问题,想想都觉得开心,但这两天真的被弄到心态爆炸

出错的原因   我没有截图,但是就是在调用py的初始化之类的函数的时候,程序就一直报错   undefined reference to  Py_Initialize    还有下面只要用到了py的一些函数,就都是这个问题, 我有按照网上的方法,在Py_Initialize之前写一句

Py_SetPythonHome(L"D:\\software\\python\\Scripts");

可是结果是,连这句也给我报错, 嗯,你很棒哦,你再这样我就要打你了哦!

然后我疯狂的找网上的跟我一样的问题的人,国内国外的网站都找了遍,有很多都不是我遇到的问题,哎,真的累。

现在我既然解决了,就把方法好好的记录下来,为了方便跟我遇到一样的问题的人。

方法总结:归根结底  你需要你的QT的位数和python的位数一样,   

本人QT  5.8  32位  MinGw

python  3.5.2   32位    

这都是我后来为了解决重装的   真的太难受了

分享qt 和python  的下载资源吧     QT  :  http://download.qt.io/archive/qt/

                                              python:  https://www.python.org/downloads/windows/

(记得下载一样的位数的,这是最关键的,下载位数对了就什么都行了) 

这里安装就不给出了,都是很简单的安装,可以百度一下,安装好了后配置一下环境变量


好了,接下来,按照操作新建一个qt的项目,然后你需要往项目里添加python的库路径了

先右键点击项目,然后选择添加库,弹出后选择外部库


点击下一步


按如上格式添加库文件,和包含路径,并依次勾选掉一些东西,再点击下一步   再点击完成


大致写了一个原来会直接报错的程序,编译通过了,运行也ok    也算是这道坎过去了。以此来缅怀我逝去的两天光阴,

也用以让跟我有一样问题的人,可以早点解决掉问题。

希望对你们有帮助 ,好了,拜了拜。







### 调用 Python 脚本或功能的方法 在 QtC++ 应用程序中调用 Python 脚本或功能可以通过多种方式实现。以下是几种常见的方法: #### 方法一:通过 `QProcess` 执行外部 Python 脚本 可以利用 Qt 提供的 `QProcess` 类来运行独立的 Python 脚本并捕获其输出。 ```cpp #include <QCoreApplication> #include <QProcess> #include <QDebug> void runPythonScript() { QProcess process; QStringList arguments; arguments << "script.py"; // 替换为实际路径 process.start("python", arguments); // 使用 python 解释器启动脚本 if (!process.waitForStarted()) { qDebug() << "Failed to start script"; return; } if (!process.waitForFinished()) { qDebug() << "Script execution failed"; return; } QByteArray output = process.readAllStandardOutput(); qDebug() << "Script Output:" << QString(output); } ``` 这种方法简单易用,适合于不需要频繁交互的情况[^4]。 #### 方法二:嵌入 Python 解析器到 C++ 中 如果需要更紧密的集成,则可以在 C++ 程序中嵌入 Python 解析器。这通常涉及使用 Python 的 C API 来加载模块、执行函数等操作。 以下是一个简单的例子展示如何初始化 Python调用一个函数: ```cpp #include <Python.h> #include <QString> int callPythonFunction(const char* moduleName, const char* functionName) { Py_Initialize(); // 初始化 Python 运行环境 PyObject *pName, *pModule, *pDict, *pFunc; pName = PyUnicode_DecodeFSDefault(moduleName); // 加载模块名 pModule = PyImport_Import(pName); // 导入模块 Py_DECREF(pName); if (pModule != nullptr) { // 如果成功导入模块 pFunc = PyObject_GetAttrString(pModule, functionName); // 获取指定函数对象 if (pFunc && PyCallable_Check(pFunc)) { // 检查该对象是否可被调用 PyObject_CallObject(pFunc, nullptr); // 调用无参数函数 Py_XDECREF(pFunc); // 清理资源 } else { PyErr_Print(); // 输出错误信息 } Py_XDECREF(pFunc); // 删除引用计数 Py_DECREF(pModule); // 减少模块引用计数 } else { PyErr_Print(); // 处理无法导入模块情况下的异常 } Py_Finalize(); // 结束 Python 环境 return 0; } ``` 此方法允许更加灵活地控制 Python 功能的行为以及数据交换过程[^5]。 #### 方法三:借助第三方库简化流程 除了直接使用 Python/C API 或者标准工具外,还有专门设计用于促进这种跨语言协作的框架和库存在,比如 Boost.Python 和 SWIG(Simplified Wrapper and Interface Generator)。这些解决方案提供了更高层次抽象层面上的支持,从而降低了开发难度并提高了效率[^6]。 以上就是关于如何从基于 QtC++ 应用里调用 Python 脚本或者特定功能的一些主要途径介绍。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值