C++不能成功调用Python第三方库

想在vs里用C++调用yolo的python代码,配置好环境后可以执行Py_Initalize() 进行初始化 ,也能对简单的.py文件做到 Py_ImportModule()并执行。可.py文件一旦含有cv2,torch等第三方库就报错了。
试着使用import_array(),发现更糟糕,连Py_ImportModule()也不能执行了,貌似是在哪一步返回值为NULL就结束了。请问大家这个问题如何解决呢?

该回答引用ChatGPT

如有疑问,可以回复我!

这个问题可能是因为缺少一些依赖项导致的。尝试按照以下步骤解决:

1、确保你已经正确安装了所需的第三方库(如cv2、torch等)并且它们能够在Python环境中正常运行。你可以在命令行中运行Python并尝试导入这些库来进行测试。

2、确保你的Python环境与你在Visual Studio中使用的Python环境相同。可以在Visual Studio中使用Python环境管理器进行设置。

3、确保你已经正确设置了Python环境变量(如PYTHONPATH等)以便于Python能够找到所需的库。

4、如果你使用了import_array(),你需要确保你已经正确地包含了numpy/arrayobject.h头文件并且已经将numpy库链接到你的程序中。你可以参考numpy的安装文档进行设置。

如果你在使用cv2库时遇到了问题,你可以尝试在导入cv2之前先使用以下代码进行初始化:


import sys
sys.path.append('/path/to/opencv/python')
import cv2

其中,'/path/to/opencv/python'是你本地安装的opencv库的路径。

如果你仍然遇到问题,你可以尝试在导入cv2之前打印一些调试信息,以便于你能够更好地了解问题的来源。比如:

import sys
print(sys.path) # 打印Python路径
import cv2

cv2,torch等第三方库需要单独安装,而且它们可能还需要cuda和nvidia的显卡驱动。

参考GPT和自己的思路:这个问题可能是由于缺少Python环境或未正确配置Python路径所致。请确保已正确安装所需的第三方库(如cv2、torch等),并将其路径添加到Python路径中。

另外,你可以尝试使用Python的虚拟环境来隔离不同的项目,以避免Python包之间的冲突。在C++代码中,可以使用Py_SetPythonHome()来设置虚拟环境的路径,以确保Python可以找到所需的库和模块。

最后,建议你检查一下Py_Initialize()和PyImport_ImportModule()函数的返回值,并在返回NULL时打印错误信息,以便更好地定位问题所在。你也可以使用PyErr_Print()函数打印Python异常的详细信息,以帮助调试。

https://blog.csdn.net/qq_44811719/article/details/126320125

这个问题可能是由于Python环境和OpenCV与PyTorch库的版本不兼容导致的。一种解决方法是尝试重新安装这些库,确保它们与Python环境兼容。另外,还可以尝试在C++代码中使用Python虚拟环境来确保环境的一致性。

以下是一些可能有用的建议:

确保Python环境和OpenCV与PyTorch库的版本兼容,可以通过升级或降级这些库来解决版本不兼容的问题。

可以使用虚拟环境来确保Python环境的一致性,以避免库之间的冲突。可以使用virtualenv或conda创建虚拟环境。

确保C++代码中的Python解释器和库路径正确,可以使用Py_SetPythonHome()和Py_SetPath()设置Python解释器和库路径。

在使用OpenCV和PyTorch之前,需要先调用相应的初始化函数,例如cv::utils::initModule_nonfree()和torch::init()。

在调用Py_Initialize()之前,可以使用Py_SetProgramName()和Py_SetPythonHome()设置Python解释器的路径和名称。

如果仍然无法解决问题,可以尝试在C++代码中捕获错误并打印错误信息,以便更好地理解问题所在。可以使用PyErr_Print()打印Python错误信息,使用std::cerr打印C++错误信息。

希望这些建议能够帮助你解决问题。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

关于import_array()返回空值的解决办法是降低numpy版本,最新的numpy可能有点不兼容,降到1.23.1就可以使整个问题解决。就可以正常导入cv2等第三方库了