Python4Delphi 处理将 Python 的主 DLL 加载到 Delphi 程序中的问题,将 Python 解释器嵌入到您的 delphi 应用程序中,但也有一些反向演示;使用 Delphi 编写扩展。下面是一些工作示例代码。
我在这里找到了一本书 book 参考,以使用 delphi 编写 python 扩展。第 469 页的 Python Programming on Win32,作者 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元组(一种不可变的数据结构,类似于向量或数组)。然后,您必须解析元组,在其中,将有 1 个或多个不同类型的参数。然后,您必须处理传入的元组对象中的每个项目可能是整数、字符串、元组、列表、字典等的事实。
您将需要学习调用 python 对象上的方法,如在 python 代码中:img.dim(),从列表中获取项目等等。
查找定义了 PyArg_ParseTuple 的任何位置(按住 ctrl 键单击它)并查找以前缀 Py 开头的其他方法,这些方法的名称可能类似于 PyList_GetItem。那是 python (PyCATEGORY_MethodName) 使用的伪 OOP 命名约定。一旦你看到一些示例代码,这一切都很容易。可悲的是,大部分示例代码都是用 C 语言编写的。
您甚至可以使用工具将上面的 Python 代码自动转换为示例 C 代码,然后尝试将其逐行转换为 Python。但这一切对我来说都是浪费时间。
更多 Python API 函数可供查找和学习:
Py_BuildValue - 用于返回值
Py_INCREF 和 Py_DECREF - 对象引用计数所必需的。
您需要在这里了解所有memory rules, and ownership rules。