c++ 调用python错误总结

c++ 调用python错误总结,第1张

参考:

  1. C++ 调用Python脚本
  2. C/C++调用python(新手必看)
  3. c调用python遇到的那些坑
  4. 解决PyRun_SimpleFile/PyRun_SimpleString报错
  5. “探坑”——在C++中执行python脚本的艰辛尝试

背景介绍:

做 deepsort 跟踪部署 c++ 调用 python 时出现好多错误,记录下来,方便后续排查。


用的IDE 是clion,总所周知它生成的可执行文件在 ./cmake-build-debug 目录下,所以查找 python 文件的位置要相对于./cmake-build-debug下的可执行文件,而不是相对于源文件。


错误1:PyImport_ImportModule老返回NULL

tree-查看目录和文件
本例中 test.cpp 调用 ./Python 中的 main_test.py

$ tree -L 2
.
├── cmake-build-debug
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── cmake_install.cmake
│   ├── Makefile
│   ├── test
│   └── test1.cbp
├── CMakeLists.txt
├── main.cpp
├── __pycache__
├── Python
│   ├── deep_sort
│   ├── detector.py
│   ├── __init__.py
│   ├── main_test.py
│   ├── models
│   ├── __pycache__
│   ├── run.py
│   ├── test_test.py
│   ├── tracker.py
│   ├── utils
│   ├── weights
│   └── yolov5
├── test.cpp
└── video
    ├── getvideo_189_2019-07-20_09-17-48.avi
    └── test.mp4

CMakeLists.txt 为:

cmake_minimum_required(VERSION 3.10)
project(test1)

set(CMAKE_CXX_STANDARD 14)

set(OpenCV_DIR /home/wxf/softwares/3rdparty/opencv_env/opencv349/share/OpenCV)
find_package(OpenCV REQUIRED)

include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(/home/wxf/softwares/3rdparty/anaconda/envs/deepsort_py37/include)

add_executable(test test.cpp)
target_link_libraries(test
        ${OpenCV_LIBS}
        /home/wxf/softwares/3rdparty/anaconda/envs/deepsort_py37/lib/libpython3.7m.so)

add_executable(main main.cpp)
target_link_libraries(main
        ${OpenCV_LIBS}
        /home/wxf/softwares/3rdparty/anaconda/envs/deepsort_py37/lib/libpython3.7m.so)

出现这个错误时:
受到启发:c++加载python模块,但是PyImport_ImportModule老返回NULL
PyRun_SimpleString改为:

PyRun_SimpleString("sys.path.append(r'../Python')");

并且删除 cmake-build-debug 文件夹,重新编译。


错误2: ModuleNotFoundError: No module named ‘tracker’
test.cpp 调用 ./Python 中的 main_test.py
main_test.py 导入 的包是:

import numpy as np
import cv2
import  tracker
from  detector import Detector

numpy 、opencv 是装的包
tracker 是 tracker.py ,detector 是 detector.py 自己写得包
参考: ModuleNotFoundError: No module named 'xxx’可能的解决方案大全
从 Python中import导入模块时出现ImportError: No module named的解决办法 、ImportError: No module named *** 问题?——理解绝对导入和相对导入 受到启发,然后修改代码:

PyRun_SimpleString("import sys");
PyRun_SimpleString("import cv2");
PyRun_SimpleString("import numpy as np");
PyRun_SimpleString("sys.path.append(r'../Python')");
//PyRun_SimpleString("sys.path.append(r'../Python')"); 一定要放在tracker 和 detector 的前面,指明它们的工作目录
PyRun_SimpleString("import tracker");
PyRun_SimpleString("from detector import Detector");
PyRun_SimpleString("import os");

错误3: 待更新…

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/564215.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-03
下一篇 2022-04-03

发表评论

登录后才能评论

评论列表(0条)

保存