gpt4 book ai didi

python - 使用 Delphi 创建 Python 扩展

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

我正在尝试使用 Python4Delphi 将 Python 函数转换为 Delphi(我希望是为了自学并提高速度)。但是我不知道这如何与 Delphi 和 Python 一起工作。这是我的原始功能:

def MyFunc(img, curve):
C = 160
for i in xrange(img.dim()[0]):
p = img[i]
img[i] = (p[0], p[1], p[2] - curve[p[0]] + C)

(img不是python列表,而是自定义对象)

我从 Python4Delphi 中找到了相关的 Demo09,但找不到任何关于如何遍历该列表、解压元组和修改值的帮助。

关于文档创建扩展的任何指示?

最佳答案

Python4Delphi 处理将 Python 的主要 DLL 加载到 Delphi 程序中的问题,将 Python 解释器嵌入到您的 Delphi 应用程序中,但也有一些相反的演示;使用 Delphi 编写扩展。下面是一些工作示例代码。

我找到了一本书book此处引用使用 delphi 编写 python 扩展。 Win32 上的 Python 编程的第 469 页,作者:Mark Hammond 和 Andy Robinson (O'Reilly)。

实现 python 扩展的 Delphi DLL 的示例 DLL 框架可能看起来像这个,取自 Python4Delphi 源代码分发中的 Demo09 文件夹:

项目(.dpr)文件来源:

library demodll;

{$I Definition.Inc}

uses
SysUtils,
Classes,
module in 'module.pas';

exports
initdemodll;
{$IFDEF MSWINDOWS}
{$E pyd}
{$ENDIF}
{$IFDEF LINUX}
{$SONAME 'demodll'}

{$ENDIF}

begin
end.

实际扩展单元(module.pas):

unit module;

interface
uses PythonEngine;

procedure initdemodll; cdecl;

var
gEngine : TPythonEngine;
gModule : TPythonModule;

implementation

function Add( Self, Args : PPyObject ) : PPyObject; far; cdecl;
var
a, b : Integer;
begin
with GetPythonEngine do
begin
if PyArg_ParseTuple( args, 'ii:Add', [@a, @b] ) <> 0 then
begin
Result := PyInt_FromLong( a + b );
end
else
Result := nil;
end;
end;

procedure initdemodll;
begin
try
gEngine := TPythonEngine.Create(nil);
gEngine.AutoFinalize := False;
gEngine.LoadDll;
gModule := TPythonModule.Create(nil);
gModule.Engine := gEngine;
gModule.ModuleName := 'demodll';
gModule.AddMethod( 'add', @Add, 'add(a,b) -> a+b' );
gModule.Initialize;
except
end;
end;

initialization
finalization
gEngine.Free;
gModule.Free;
end.

请注意,可以从 python 调用的方法只能有参数 Self, Args : PPyObject 作为参数签名,Args 值是一个 Python 元组(一种类似于 vector 的不可变数据结构或数组)。然后你必须解析元组,在它里面,会有 1 个或多个不同类型的参数。然后你必须处理这样一个事实,即传入的元组对象中的每个项目都可以是整数、字符串、元组、列表、字典等。

您将需要学习如何在 python 代码中调用 python 对象的方法:img.dim(),从列表中获取项目等等。

查找任何定义了 PyArg_ParseTuple 的地方(按住 Ctrl 并单击它)并查找以前缀 Py 开头的其他方法,这些方法的名称可能类似于 PyList_GetItem。这是 python 使用的伪 OOP 命名约定 (PyCATEGORY_MethodName)。一旦您看到一些示例代码,这一切都非常简单。遗憾的是,大部分示例代码都是用 C 编写的。

您甚至可以使用工具将上面的 Python 代码自动转换为示例 C 代码,然后尝试逐行将其转换为 Python。但对我来说,这一切听起来都是浪费时间。

一些更多的 Python API 函数来查找和学习:

Py_BuildValue - 对返回值很有用

Py_INCREFPy_DECREF - 对象引用计数所必需的。

您需要了解所有 memory rules, and ownership rules在这里。

关于python - 使用 Delphi 创建 Python 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8244121/

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