我正在尝试使用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,但找不到任何关于如何浏览该列表、解压元组和修改值的帮助。
对于创建扩展的文档有什么建议吗?
发布于 2011-11-24 04:40:54
Python4Delphi处理将Python主DLL加载到Delphi程序中的问题,将Python解释器嵌入到您的Delphi应用程序中,但也有一些相反的演示;使用delphi编写扩展。下面是一些可用的示例代码。
我在这里找到了一本关于用book编写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元组(类似于向量或数组的不可变数据结构)。然后你必须解析这个元组,在它里面,将有一个或多个不同类型的参数。然后,您必须处理这样一个事实,即传入的tuple对象中的每一项都可以是整数、字符串、元组、列表、字典等。
您将需要学习如何像在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。
https://stackoverflow.com/questions/8244121
复制相似问题