gpt4 book ai didi

python - 如何在 Delphi 中使用 C API 函数 PyArg_ParseTupleAndKeywords?

转载 作者:太空宇宙 更新时间:2023-11-03 15:13:58 25 4
gpt4 key购买 nike

我目前正在使用 python4delphi 编写一个 Python 模块.我想使用标准 C API 函数 PyArg_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');

我该如何解决这个问题?有没有办法调试此类错误?

最佳答案

您对 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]

后者至少是类型安全的。


我注意到您将 AAABBB 声明为 PChar 类型。当然应该是 PAnsiChar


我不确定您是否已正确准备所有其他参数。我不熟悉这个特定的 API 调用。不过可以肯定的是,我上面描述的是要解决的第一个也是最重要的问题。

我确实想知道调用者应该如何释放返回给您的字符串?我想您应该这样做。

关于python - 如何在 Delphi 中使用 C API 函数 PyArg_ParseTupleAndKeywords?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23170943/

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