Qt C++与Python混合编程:补充错误

在提示中,需要引用Python.h,出现错误。

1、找不到Python.h

如果是pro工程,需要在里面配置;

INCLUDEPATH += /Users/xinnianwang/opt/anaconda3/include
LIBS += /Users/xinnianwang/opt/anaconda3/lib

如果是CMakeLists.txt需要配置

find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
target_link_libraries(testHpy ${PYTHON_LIBRARIES})

2、会出现object.h中的参数错误。

因为slots和qT中的slots关键词矛盾。

error: expected member name or ';' after declaration specifiers PyType_Slot *slots; /* terminated by slot==0. */ ~~~~~~~~~~~ ^

需要在头文件中使用

#undef slots
#include <python3.9/Python.h>
#define slots Q_SLOTS

3、出现编码错误:Fatal Python error: failed to get the Python codec of the filesystem encoding

这是一个 Python 运行错误,可能是因为 Python 解释器无法获取系统文件系统编码的编解码器。具体来说,Python 试图将字符串转换为字节串或者反之,但由于无法获取文件系统编码的编解码器,导致程序出现错误。

根据 Stack Overflow 上的一篇回答 [1],该错误可能与 Windows 环境变量 PYTHONPATHPYTHONHOME 有关。如果这些环境变量被设置了错误的路径,将导致 Python 解释器无法找到所需的编解码器,从而导致上述错误。

另外,Python 官方文档中有关于编码器的章节 [3],这里介绍了 codecs 模块的基本概念和使用方法,其中包括如何定义自定义编解码器等。

要解决这个问题,可以尝试以下几种方法:

  1. 确认环境变量 PYTHONPATH 和 PYTHONHOME 是否正确设置。
  2. 尝试删除系统环境变量 PYTHONPATH 和 PYTHONHOME ,重新安装 Python。
  3. 尝试重新安装 Python 编译器来修复编解码器问题。

4、设置 配置windows的PYTHONHOME和PYTHONPATH

要配置 Windows 的 PYTHONHOMEPYTHONPATH 环境变量,可以按照以下步骤操作:

  1. 打开 Windows 的 “控制面板 -> 系统和安全 -> 系统”,点击左侧的 “高级系统设置”。
  2. 在弹出的 “系统属性” 窗口中,选择 “高级” 选项卡,然后点击窗口下方的 “环境变量” 按钮。
  3. 在 “系统变量” 区域中,点击 “新建” 按钮,输入 PYTHONHOME 作为变量名,然后将 Python 安装目录的路径(如 C:\Users\wangxn\anaconda3)作为变量值,最后点击 “确定”。
  4. 在同样的 “系统变量” 区域中,找到 Path 变量,点击 “编辑” 按钮。
  5. 在弹出的 “编辑环境变量” 窗口中,点击 “新建” 按钮,输入 %PYTHONHOME%,然后点击 “确定” 两次。
  6. 再在 “系统变量” 区域中,点击 “新建” 按钮,输入 PYTHONPATH 作为变量名,然后将 Python 应用程序搜索模块文件的路径(如 C:\Users\wangxn\anaconda3\Lib\site-packages)作为变量值,最后点击 “确定”。
  7. 完成后,点击 “确定” 关闭所有窗口。

通过以上步骤,你就可以成功地配置 Windows 的 PYTHONHOMEPYTHONPATH 环境变量了,可以在程序中使用相应的环境变量来正确地加载 Python 模块和编解码器。

5、main.cpp:8:5: No matching function for call to 'Py_SetProgramName' pylifecycle.h:40:18: candidate function not viable: no known conversion from 'char *' to 'const wchar_t *' for 1st argument 这个错误方案,请举例 

这个错误通常是由于编译器无法将 char* 类型的 C 字符串隐式转换为 wchar_t* 类型的宽字符字符串。Py_SetProgramName 函数期望接收一个宽字符字符串类型的参数,但在代码中给出了普通 C 字符串类型的参数,导致编译器报错。

以下是一些解决此问题的示例方案:

#include <Python.h>

int main() {
    const wchar_t *program = Py_DecodeLocale("example", nullptr);
    Py_SetProgramName(program);
    PyMem_RawFree(const_cast<wchar_t *>(program));
    // ...
    return 0;
}

在这里,我们首先调用 Py_DecodeLocale 函数将 "example" 字符串转换为宽字符字符串类型,并将结果存储在 program 变量中。我们将 program 参数传递给 Py_SetProgramName 函数,以设置 Python 解释器的程序名称。最后,我们使用 PyMem_RawFree 函数释放 program 变量所分配的内存。

6、:-1: error: LNK1104: 无法打开文件“python39_d.lib”

这个一般使用的msvc编译器编译的,改为MinGw即可。

下面这个解决方案我试验过。

在这个 Stack Overflow 页面中,有人询问了与 "LNK1104: cannot open file 'python39_d.lib'" 相关的错误。在这个问题的回答中,有人建议创建一个重名为 python39_d.lib 的 Python 库文件的副本,并将其放在项目目录下。还有一些其他的解决方案,例如编辑 pyconfig.h 文件,以替换 python39_d.lib 的 pragma 指令,或者重新设置库文件路径等。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值