我目前正在使用python4delphi编写Python模块。我想使用标准的C函数ParseTupleAndKeywords。
正如您从文档中看到的那样,签名如下:
int PyArg_ParseTupleAndKeywords(PyObject *args, PyObject *kw, const char *format,
char *keywords[], ...)现在,这个函数没有包装在python4delphi中,所以我自己添加了它:
PyArg_ParseTupleAndKeywords: function (args, kw: PPyObject; format: PAnsiChar;
keywords: array of PAnsiChar {;...}): Integer; cdecl varargs;
....
PyArg_ParseTupleAndKeywords := Import('PyArg_ParseTupleAndKeywords');我遇到的问题是,当我试图以类似于以下代码段的方式使用它时,我会得到一个访问冲突错误:
function PyScript_MyFunction(pself, args, keywds : PPyObject) : PPyObject; cdecl;
var
AAA, BBB : PChar;
kwlist : array[0..2] of PAnsiChar;
begin
kwlist[0] := 'AAA';
kwlist[1] := 'BBB';
kwlist[2] := nil;
BBB := 'BBB';
with GetPythonEngine do
begin
if (PyErr_Occurred() = nil) and (PyArg_ParseTupleAndKeywords(args, keywds,
's|s:Script_MyFunction', kwlist, @AAA, @BBB) <> 0) then
begin
Result := VariantAsPyObject(MyFunction(AAA, BBB));
end
else
Result := nil;
end;
end;
//Module is my Python module I am working with
Module.AddMethodWithKeywords('Wrapped', @PyScript_MyFunction, 'no doc');我怎么才能解决这个问题?有办法调试这样的错误吗?
发布于 2014-04-19 14:12:06
keywords参数的转换是不正确的。您使用了Delphi打开数组。Delphi打开数组的结果是传递两件事:数组中最后一项的索引和指向数组第一个元素的指针。Delphi打开的数组根本就不能用于互操作。
您需要像这样声明该参数:
keywords: PPAnsiChar这是指向PAnsiChar的指针。
按如下方式调用函数:
PyArg_ParseTupleAndKeywords(..., @kwlist[0], ...) 就我个人而言,我将使用动态数组来准备您的参数:
var
kwlist: TArray<PAnsiChar>;初始化如下:
kwlist := TArray<PAnsiChar>.Create('AAA', 'BBB', nil);然后像这样递过来:
PPAnsiChar(kwlist)或者像这样,如果你喜欢:
@kwlist[0]后者至少是打字用的。
我注意到,您将AAA和BBB声明为PChar类型。当然,那应该是PAnsiChar。
我很难确定你是否正确地准备了所有其他参数。我不熟悉这个特定的API调用。当然,我上面描述的是第一个也是最重要的问题。
我想知道调用者是如何释放返回给您的字符串的?我想你一定会这么做的。
https://stackoverflow.com/questions/23170943
复制相似问题