Qt调用Python遇到的问题(一)

  • 在Debug环境下使用Python。

一般情况下,默认安装的python版本是release版本,因此安装文件中库获取的版本也为release版本,在C++需要调用Debug版本时,网上有两种解决方案,第一种没有亲测。

  1. 可以在网上下载debug版本库。
  2. 可以将python27.lib修改为python27_d.lib,手动修改的方式,但是手动修改往往有编译不通过的问题,提示无法找到Debug版本的静态库,可以通过以下方式在调用python的源文件中进行修改:
  • 修改 pyconfig.h
#ifdef _DEBUG
# define Py_DEBUG
#endif

#ifdef _DEBUG
//# define Py_DEBUG
#endif

修改

# ifdef _DEBUG
# pragma comment(lib,"python27_d.lib")
# else
# pragma comment(lib,"python27.lib")
# endif /* _DEBUG */

# ifdef _DEBUG
# pragma comment(lib,"python27.lib")
# else
# pragma comment(lib,"python27.lib")
# endif /* _DEBUG */

修改object.h

#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS)
#define Py_TRACE_REFS
#endif

为:

#if defined(Py_DEBUG) &
### 如何在 Qt 中嵌入和调用 Python 脚本 #### 安装必要的依赖项 为了能够在Qt程序中成功嵌入并调用Python脚本,首先需要安装Miniconda3。这步骤是为了创建独立于系统默认Python环境的工作空间,从而确保即使目标机器上未安装Python解释器也能够正常工作[^2]。 #### 配置项目文件 接着,在`.pro`项目配置文件里添加如下内容以便链接PySide2库(这是Qt官方支持用于绑定Python的模块),以及指定额外的包含路径和库目录: ```qmake QT += core gui widgets network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 console CONFIG -= app_bundle SOURCES += main.cpp \ python_embedded.cpp HEADERS += python_embedded.h LIBS += -L$$PWD/../../miniconda3/envs/qt_python/lib/ INCLUDEPATH += $$PWD/../../miniconda3/envs/qt_python/include/python3.8/ # 添加 PySide2 库位置 QMAKE_CXXFLAGS += -I$$PWD/../../miniconda3/envs/qt_python/include/PySide2 LIBS += -lshiboken2 -lQt5Core -lQt5Gui -lQt5Widgets -lpython3.8d ``` 上述设置假设读者已经在本地通过Conda创建了个名为qt_python的虚拟环境,并激活该环境中包含了PySide2和其他所需的包。 #### 编写 C++ 代码实现 Python 解释器初始化与释放 下面展示的是个简单的例子,展示了怎样利用C++去启动Python解释器、加载外部.py文件内的函数定义然后执行它们;最后再关闭这个实例化出来的解释器对象。 ```cpp // 文件名: python_embedded.cpp #include "python_embedded.h" #include <QString> extern "C" { #include <Python.h> } void initializePython() { Py_Initialize(); // 初始化Python解释器 } bool runExternalScript(const QString& scriptPath) { FILE* file; #ifdef _MSC_VER fopen_s(&file, scriptPath.toStdString().c_str(), "r"); #else file = fopen(scriptPath.toStdString().c_str(), "r"); /* Linux */ #endif if (file != NULL) { int result = PyRun_SimpleFile(file, scriptPath.toUtf8().constData()); fclose(file); return true; // 成功读取并运行了给定路径下的Python脚本 } else { qDebug()<<"Failed to open the specified Python script."; return false; } } void finalizePython() { Py_FinalizeEx(); // 清理资源并结束会话 } ``` 以上实现了基本的功能框架,即可以在Qt应用内部安全地操作Python引擎而不会影响宿主进程稳定性的同时完成预期任务。 #### 创建对应的头文件声明接口方法 为了让其他部分的应用能方便地访问这些功能,还需要准备相应的头文件来进行公开说明: ```cpp // 文件名: python_embedded.h #ifndef PYTHON_EMBEDDED_H #define PYTHON_EMBEDDED_H class PythonEmbedded { public: static void Initialize(); static bool RunExternalScript(QString path); static void Finalize(); }; #endif //PYTHON_EMBEDDED_H ``` 这样就完成了整个流程的设计,允许开发者轻松地把现有的Python逻辑集成进来并与图形界面组件交互起来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值