在提示中,需要引用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 环境变量 PYTHONPATH
和 PYTHONHOME
有关。如果这些环境变量被设置了错误的路径,将导致 Python 解释器无法找到所需的编解码器,从而导致上述错误。
另外,Python 官方文档中有关于编码器的章节 [3],这里介绍了 codecs
模块的基本概念和使用方法,其中包括如何定义自定义编解码器等。
要解决这个问题,可以尝试以下几种方法:
- 确认环境变量
PYTHONPATH
和PYTHONHOME
是否正确设置。 - 尝试删除系统环境变量
PYTHONPATH
和PYTHONHOME
,重新安装 Python。 - 尝试重新安装 Python 编译器来修复编解码器问题。
4、设置 配置windows的PYTHONHOME和PYTHONPATH
要配置 Windows 的 PYTHONHOME
和 PYTHONPATH
环境变量,可以按照以下步骤操作:
- 打开 Windows 的 “控制面板 -> 系统和安全 -> 系统”,点击左侧的 “高级系统设置”。
- 在弹出的 “系统属性” 窗口中,选择 “高级” 选项卡,然后点击窗口下方的 “环境变量” 按钮。
- 在 “系统变量” 区域中,点击 “新建” 按钮,输入
PYTHONHOME
作为变量名,然后将 Python 安装目录的路径(如C:\Users\wangxn\anaconda3
)作为变量值,最后点击 “确定”。 - 在同样的 “系统变量” 区域中,找到
Path
变量,点击 “编辑” 按钮。 - 在弹出的 “编辑环境变量” 窗口中,点击 “新建” 按钮,输入
%PYTHONHOME%
,然后点击 “确定” 两次。 - 再在 “系统变量” 区域中,点击 “新建” 按钮,输入
PYTHONPATH
作为变量名,然后将 Python 应用程序搜索模块文件的路径(如C:\Users\wangxn\anaconda3\Lib\site-packages
)作为变量值,最后点击 “确定”。 - 完成后,点击 “确定” 关闭所有窗口。
通过以上步骤,你就可以成功地配置 Windows 的 PYTHONHOME
和 PYTHONPATH
环境变量了,可以在程序中使用相应的环境变量来正确地加载 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 指令,或者重新设置库文件路径等。