gpt4 book ai didi

python - 在 Python 中使用回调时出错

转载 作者:太空狗 更新时间:2023-10-29 19:27:40 27 4
gpt4 key购买 nike

我正在开发一个应该在 Python 中使用的 dll。我有一个回调函数来发送我的参数(在单独的 header 中定义):

typedef int(*call_nBest)(char **OutList, float* confList, int nB);

因此,我以这种方式使用此回调:

#define TEXT_BUFFER_MAX_SIZE 50
call_nBest nBestList;
void Xfunction(const char* aLineThatWillBeConvertedInAList){
char **results;
float *confidences;
confidences=new float[nBest];
results=new char*[nBest];
for(int i=0; i<nBest; i++) results[i]=new char[TEXT_BUFFER_MAX_SIZE];

MakeLine2List(aLineThatWillBeConvertedInAList,results,confidences);

/*At this function I am having the error :(*/
nBestList(results,confidences,nBest); // Passing the values to my callback

for(int i=0; i<nBest; i++) delete [] results[i];
delete [] confidences;
delete [] results;

}

我以这种方式导出它:

__declspec(dllexport) int ResultCallback(call_nBest theList){
nBestList = theList;
return(0);
}

我首先在另一个 C++ 应用程序中以这种方式测试了我的回调:

int MyCallback(char **OutLi, float* confLi, int nB){
printf("\n The nB results: %d \n",nB);
for(int n=0; n<nB; n++){
std::cout << *(confLi+n) << "\t" << OutLi[n] << "\n";
}
return(0);
}

main() 中,我以这种方式提供回调:

ResultCallback(MyCallback);

而且效果很好。但我不知道如何使它适应 Python。我试过这个:

注意:我改了最后一种方式,因为我解决了一些错误,但还是报错。这是我当前加载 myDLL

的方式
from ctypes import *
def callbackU(OutList,ConList,nB):
for i in range(nB):
print(OutList[i][0:50]) #I don't know how to print the values
return 0

myDLL = cdll.LoadLibrary("MyLibrary.dll")

calling = CFUNCTYPE(c_int,POINTER(POINTER(c_char)),POINTER(c_float),c_int)
theCall= calling(callbackU)
myDLL.ResultCallback(theCall)

myDLL.StartProcess(); #In this process the given callback will be invoqued

错误

现在我有这个错误:

Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. at Xfunction(SByte* aLineThatWillBeConvertedInAList)

Problem signature:

Problem Event Name: APPCRASH
Application Name: python.exe
Application Version: 0.0.0.0
Application Timestamp: 54f9ed12
Fault Module Name: MSVCR100.dll
Fault Module Version: 10.0.40219.325
Fault Module Timestamp: 10.0.40219.325
Exception Code: c0000005
Exception Offset: 00001ed7
OS Version: 6.3.9600.2.0.0.256.4
Locale ID: 1033
Additional Information 1: 5861
Additional Information 2: 5861822e1919d7c014bbb064c64908b2
Additional Information 3: a10f
Additional Information 4: a10ff7d2bb2516fdc753f9c34fc3b069

我做过的并且几乎是我想要的事情:

首先,我为此更改了回调 Python 函数:

def callbackU(OutList,ConList,nB):
for i in range(nB):
print(i)
return 0

一切正常,我可以在控制台中看到这一点(在本例中 nB10):

0
1
...
9

其次,我把函数改成了这个:

def callbackU(OutList,ConList,nB):
for i in range(nB):
print (cast(OutList,c_char_p))
return 0

而且,哦,令人惊讶的是,这只打印了列表的第一个单词(nB 次)

最佳答案

你想要这样的东西吗?

def callbackU(OutList, ConList, nB):
for i in range(nB):
print("{}\t{}".format(ConList[i], cast(OutList[i], c_char_p)))
return 0

据我了解,您只是想将 Python callbackU 函数的输出与 C++ MyCallback 函数相匹配。

Python 有多种 string formatting functionality一开始可能会让人感到困惑,但要向 printf 字符串格式致敬。

由于 OutList 的类型为 LP_LP_c_char(指向 c_char 的指针,与“NULL 终止 char *”相比c_char_p),我们最好将其转换为原生 Python 数据类型,如下所示:

def callbackU(OutList, ConList, nB):
for i in range(nB):
out_list_item = cast(OutList[i], c_char_p).value
print("{}\t{}".format(ConList[i], out_list_item))
return 0

关于python - 在 Python 中使用回调时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33377764/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com