[英]Python script stuck when reaching CV2 functions
我正在嘗試使用boost:python從C ++調用python腳本。
調用模塊和類,並且一切正常,直到腳本到達使用opencv的函數為止
調用python的c ++代碼是通過線程啟動的類的一部分。 調用python的代碼部分是:
#include <boost/python.hpp>
#include "boost/python/stl_iterator.hpp"
#include <opencv2/opencv.hpp>
...
imencode(".jpg", image, imageBuffer);
namespace python = boost::python;
vector<unsigned char>::iterator iter;
python::list list;
for (iter = imageBuffer.begin(); iter != imageBuffer.end(); ++iter) {
list.append(*iter);
}
python::object python_module = python::import("file");
python::object klass = python_module.attr("klass")(this->modelPath.c_str());
python::object res = klass.attr("fun")(list);
file.py看起來像:
import numpy as np
import cv2
class klass:
def __init__(self, model_path):
self.model = model_path
def fun(self, image):
image = np.asarray(image, dtype=np.uint8)
print("b4")
image = cv2.imdecode(image, 1)
print("after")
return 1
打印“ print(” b4“)”行,但是一旦達到imdecode,代碼就會卡住,什么也不會發生
使用以下命令安裝opencv-python
sudo pip3 install opencv-python
opencv-python版本是4.1.0,numpy版本是1.16.3
我正在使用python 3.5
為什么代碼會暫停以及如何解決
編輯
我只需要提到調用是從線程完成的。 如果調用是從Main進行的,則代碼有效。 通過pthread_create()調用此代碼
顯然我在線程中丟失了一些東西
編輯2
因此,這確實是一個線程問題,我想出了“解決方案”作為答案。 我不知道這是否是解決問題的正確方法,但它有效
為了解決這個問題,我在py_initialize之后添加了以下內容
Py_Initialize();
PyEval_InitThreads();
PyEval_ReleaseLock();
然后當線程啟動時,我做了:
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();
然后做所有的python調用....
在通話結束時
PyGILState_Release(gstate);
請注意,PyGILState_Release()之后的所有python調用(甚至是DECREF調用)都將無法正常工作,並導致代碼崩潰,這就是為什么我將此調用放在線程類析構函數中作為最后要調用的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.