You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt Creator调用Python函数时报PyObject未声明标识符如何解决

问题排查解决步骤

1. 确认Python版本兼容性

  • 如果你使用的是Python3.x,Python2的旧API已经弃用,PyString_FromString在Python3中已替换为PyUnicode_FromString,且Python3的Python.h已经内置PyObject类型定义。如果本地同时安装了Python2和Python3,需要确认Qt引入的头文件对应你使用的Python版本。
  • 排查方法:打开你引入的Python.h文件,搜索PyObject关键词,确认头文件中存在该类型的定义,如果没有说明你引用的头文件路径错误,指向了残缺的Python SDK或者错误版本的文件。

2. 检查Qt .pro项目配置是否正确

你需要在项目的.pro文件中手动添加Python头文件路径和链接库路径,示例配置(替换为你本地Python的实际安装路径):

# Windows Python3.10 示例
INCLUDEPATH += C:/Python310/include
LIBS += -LC:/Python310/libs -lpython310

# macOS 示例
# INCLUDEPATH += /Library/Frameworks/Python.framework/Versions/3.10/include/python3.10
# LIBS += -framework Python

# Linux 示例
# INCLUDEPATH += /usr/include/python3.10
# LIBS += -lpython3.10

配置完成后右键项目点击执行qmake,再重新构建项目,否则配置不会生效。

3. 检查头文件引入顺序和宏定义

#define PY_SSIZE_T_CLEAN必须放在#include <Python.h>的前面,你当前代码的顺序是对的。如果项目有预编译头文件(比如Qt的pch.h),不要把Python.h放到预编译头里,直接在用到的cpp文件顶部引入即可。

4. 修正代码中的其他错误

4.1 test.py缩进修正

Python对缩进敏感,原代码缩进错误会导致模块加载失败,修正后:

import math
def myabs(x):
    return math.fabs(x)

4.2 test.cpp代码修正

  • 增加Python解释器初始化、资源释放逻辑,补充空指针判断避免崩溃
  • Python3下替换PyString_FromString为PyUnicode_FromString
  • 补全缺失的分号,添加Python对象引用计数释放逻辑避免内存泄漏
    修正后代码:
#define PY_SSIZE_T_CLEAN
#include <Python.h>
void MainWindow::on_pushButton_clicked()
{
    Py_Initialize();
    if (!Py_IsInitialized()) {
        return;
    }
    // 将test.py所在路径加入Python搜索路径,避免找不到模块
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')"); // 替换为test.py的实际存放路径

    PyObject* myModuleString = PyUnicode_FromString("test");
    PyObject* myModule = PyImport_Import(myModuleString);
    Py_DECREF(myModuleString);
    if (!myModule) {
        PyErr_Print();
        Py_Finalize();
        return;
    }
    PyObject* myFunction = PyObject_GetAttrString(myModule,"myabs");
    if (!myFunction || !PyCallable_Check(myFunction)) {
        PyErr_Print();
        Py_DECREF(myModule);
        Py_Finalize();
        return;
    }
    PyObject* args = PyTuple_Pack(1,PyFloat_FromDouble(2.0));
    PyObject* myResult = PyObject_CallObject(myFunction, args);
    Py_DECREF(args);
    Py_DECREF(myFunction);
    Py_DECREF(myModule);
    if (myResult) {
        double result = PyFloat_AsDouble(myResult);
        Py_DECREF(myResult);
        // 后续可使用result变量
    } else {
        PyErr_Print();
    }
    Py_Finalize();
}

内容的提问来源于stack exchange,提问作者Phát Đạt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:24:03