保姆级教程在Qt Creator里用C调用Python函数附Anaconda环境配置与三大坑点修复在跨语言开发领域C与Python的混合编程正成为提升开发效率的利器。当我们需要将Python丰富的数据科学生态与C的高性能计算相结合时Qt Creator作为跨平台IDE提供了理想的开发环境。本教程将手把手带你完成从Anaconda环境配置到成功调用的全流程特别针对Windows平台下使用MSVC编译器的典型问题提供解决方案。1. 环境准备与项目创建1.1 安装必备组件确保已安装以下软件并配置好基础环境Qt Creator建议5.15版本Visual Studio对应MSVC编译器Anaconda3推荐2023.07版本注意避免使用MinGW编译器因其与Python C API的兼容性问题较多1.2 创建qmake项目打开Qt Creator选择新建项目选择Application → Qt Console Application在Kit Selection中勾选MSVC2019 64bit或对应VS版本取消勾选Generate form选项关键配置参数示例// .pro文件需包含的基本配置 QT core QT - gui CONFIG c17 TARGET PyQtIntegration2. Anaconda环境深度配置2.1 验证Python开发环境在Anaconda Prompt中执行conda list | findstr python确认输出包含python和python-dev相关包典型输出应类似python 3.10.11 h6244533_2 python-lib 3.10.11 hdbf39b2_72.2 配置系统环境变量这是避免硬编码路径的关键步骤变量名示例值作用PYTHONHOMEF:\Anaconda3指定Python根目录PYTHONPATHF:\Anaconda3\DLLs模块搜索路径配置完成后需要重启Qt Creator使变更生效。3. 项目集成Python库3.1 添加Python头文件支持在.pro文件中添加以下配置路径需替换为实际值INCLUDEPATH $$(PYTHONHOME)/include LIBS -L$$(PYTHONHOME)/libs -lpython3103.2 解决Qt slots冲突修改Python头文件前建议先备份// 在包含Python.h之前添加宏定义 #define PY_SSIZE_T_CLEAN #undef slots #include Python.h #define slots Q_SLOTS4. 三大核心坑点解决方案4.1 ModuleNotFoundError终极修复当出现No module named encodings错误时按优先级尝试以下方案环境变量法推荐// 在Py_Initialize()前设置 Py_SetPythonHome(LF:\\Anaconda3);注册表修改法reg add HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\3.10 /v PythonPath /t REG_SZ /d F:\Anaconda3路径注入法Py_GetPath(); // 获取当前搜索路径 PySys_SetPath(Lnew_path); // 添加自定义路径4.2 文件定位难题破解确保Python文件能被找到的三种方式同级目录法将.py文件与生成的可执行文件放在同一目录路径硬编码法不推荐PyRun_SimpleString(import sys\nsys.path.append(D:/project));环境变量法在系统PATH中添加.py文件所在目录4.3 内存管理最佳实践C调用Python时常见的内存泄漏问题防范// 正确的资源释放顺序示例 PyObject* pModule PyImport_ImportModule(demo); PyObject* pFunc PyObject_GetAttrString(pModule, calculate); // 使用后必须递减引用计数 Py_DECREF(pFunc); Py_DECREF(pModule);5. 实战数值计算模块调用下面演示调用NumPy进行矩阵运算的完整流程准备Python脚本math_util.pyimport numpy as np def matrix_mult(a, b): return (np.array(a) np.array(b)).tolist()C调用代码示例Py_Initialize(); PyRun_SimpleString(import sys; sys.path.append(.)); PyObject* pModule PyImport_ImportModule(math_util); PyObject* pFunc PyObject_GetAttrString(pModule, matrix_mult); // 构建参数 PyObject* pArgs PyTuple_New(2); PyObject* pList1 PyList_New(2); PyObject* pList2 PyList_New(2); // 填充数据... PyObject* pResult PyObject_CallObject(pFunc, pArgs); // 结果处理... Py_Finalize();6. 项目移植与打包指南6.1 跨机器部署方案创建env_config.ini配置文件[Python] home_path ${PYTHONHOME} libs_path ${PYTHONHOME}/libs6.2 使用windeployqt打包添加Python库到打包目录windeployqt --qmldir . build/release copy %PYTHONHOME%\python310.dll build/release xcopy /E /I %PYTHONHOME%\DLLs build/release\DLLs在实际项目中我发现最稳定的配置方式是使用虚拟环境配合相对路径引用。例如创建一个项目专用的conda环境然后将整个env目录随项目一起分发这样可以避免大多数环境依赖问题。
保姆级教程:在Qt Creator里用C++调用Python函数(附Anaconda环境配置与三大坑点修复)
保姆级教程在Qt Creator里用C调用Python函数附Anaconda环境配置与三大坑点修复在跨语言开发领域C与Python的混合编程正成为提升开发效率的利器。当我们需要将Python丰富的数据科学生态与C的高性能计算相结合时Qt Creator作为跨平台IDE提供了理想的开发环境。本教程将手把手带你完成从Anaconda环境配置到成功调用的全流程特别针对Windows平台下使用MSVC编译器的典型问题提供解决方案。1. 环境准备与项目创建1.1 安装必备组件确保已安装以下软件并配置好基础环境Qt Creator建议5.15版本Visual Studio对应MSVC编译器Anaconda3推荐2023.07版本注意避免使用MinGW编译器因其与Python C API的兼容性问题较多1.2 创建qmake项目打开Qt Creator选择新建项目选择Application → Qt Console Application在Kit Selection中勾选MSVC2019 64bit或对应VS版本取消勾选Generate form选项关键配置参数示例// .pro文件需包含的基本配置 QT core QT - gui CONFIG c17 TARGET PyQtIntegration2. Anaconda环境深度配置2.1 验证Python开发环境在Anaconda Prompt中执行conda list | findstr python确认输出包含python和python-dev相关包典型输出应类似python 3.10.11 h6244533_2 python-lib 3.10.11 hdbf39b2_72.2 配置系统环境变量这是避免硬编码路径的关键步骤变量名示例值作用PYTHONHOMEF:\Anaconda3指定Python根目录PYTHONPATHF:\Anaconda3\DLLs模块搜索路径配置完成后需要重启Qt Creator使变更生效。3. 项目集成Python库3.1 添加Python头文件支持在.pro文件中添加以下配置路径需替换为实际值INCLUDEPATH $$(PYTHONHOME)/include LIBS -L$$(PYTHONHOME)/libs -lpython3103.2 解决Qt slots冲突修改Python头文件前建议先备份// 在包含Python.h之前添加宏定义 #define PY_SSIZE_T_CLEAN #undef slots #include Python.h #define slots Q_SLOTS4. 三大核心坑点解决方案4.1 ModuleNotFoundError终极修复当出现No module named encodings错误时按优先级尝试以下方案环境变量法推荐// 在Py_Initialize()前设置 Py_SetPythonHome(LF:\\Anaconda3);注册表修改法reg add HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\3.10 /v PythonPath /t REG_SZ /d F:\Anaconda3路径注入法Py_GetPath(); // 获取当前搜索路径 PySys_SetPath(Lnew_path); // 添加自定义路径4.2 文件定位难题破解确保Python文件能被找到的三种方式同级目录法将.py文件与生成的可执行文件放在同一目录路径硬编码法不推荐PyRun_SimpleString(import sys\nsys.path.append(D:/project));环境变量法在系统PATH中添加.py文件所在目录4.3 内存管理最佳实践C调用Python时常见的内存泄漏问题防范// 正确的资源释放顺序示例 PyObject* pModule PyImport_ImportModule(demo); PyObject* pFunc PyObject_GetAttrString(pModule, calculate); // 使用后必须递减引用计数 Py_DECREF(pFunc); Py_DECREF(pModule);5. 实战数值计算模块调用下面演示调用NumPy进行矩阵运算的完整流程准备Python脚本math_util.pyimport numpy as np def matrix_mult(a, b): return (np.array(a) np.array(b)).tolist()C调用代码示例Py_Initialize(); PyRun_SimpleString(import sys; sys.path.append(.)); PyObject* pModule PyImport_ImportModule(math_util); PyObject* pFunc PyObject_GetAttrString(pModule, matrix_mult); // 构建参数 PyObject* pArgs PyTuple_New(2); PyObject* pList1 PyList_New(2); PyObject* pList2 PyList_New(2); // 填充数据... PyObject* pResult PyObject_CallObject(pFunc, pArgs); // 结果处理... Py_Finalize();6. 项目移植与打包指南6.1 跨机器部署方案创建env_config.ini配置文件[Python] home_path ${PYTHONHOME} libs_path ${PYTHONHOME}/libs6.2 使用windeployqt打包添加Python库到打包目录windeployqt --qmldir . build/release copy %PYTHONHOME%\python310.dll build/release xcopy /E /I %PYTHONHOME%\DLLs build/release\DLLs在实际项目中我发现最稳定的配置方式是使用虚拟环境配合相对路径引用。例如创建一个项目专用的conda环境然后将整个env目录随项目一起分发这样可以避免大多数环境依赖问题。