Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Delphi创建Python扩展_Python_Delphi_Python4delphi - Fatal编程技术网

用Delphi创建Python扩展

用Delphi创建Python扩展,python,delphi,python4delphi,Python,Delphi,Python4delphi,我正在尝试使用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将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编写扩展。下面是一些工作示例代码

我在这里找到了一本使用delphi编写python扩展的参考书。MarkHammond和AndyRobinson(O'Reilly)在Win32上编写Python编程的第469页

实现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.
实际扩展单元(模块pas):

单元模块;
接口
使用PythonEngine;
程序初始化;cdecl;
变量
gEngine:TPythonEngine;
gModule:TPythonModule;
实施
函数添加(Self,Args:PPyObject):PPyObject;远的cdecl;
变量
a、 b:整数;
开始
使用GetPythonEngine do
开始
如果PyArg_ParseTuple(args,'ii:Add',[@a,@b])为0,则
开始
结果:=PyInt_FromLong(a+b);
结束
其他的
结果:=无;
结束;
结束;
程序初始化;
开始
尝试
gEngine:=TPythonEngine.Create(nil);
gEngine.AutoFinalize:=False;
gEngine.LoadDll;
gModule:=TPythonModule.Create(nil);
gModule.Engine:=gEngine;
gModule.ModuleName:=“解调器”;
AddMethod('add',@add',add(a,b)->a+b');
初始化;
除了
结束;
结束;
初始化
定稿
免费;
gModule.Free;
结束。
请注意,可以从python调用的方法只能将参数
Self、Args:PPyObject
作为其参数签名,并且Args值是python元组(类似于向量或数组的不可变数据结构)。然后必须解析元组,在元组中,将有1个或多个不同类型的参数。然后,您必须处理这样一个事实:传入的tuple对象中的每个项都可以是整数、字符串、tuple、列表、字典等

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

查找定义了
PyArg\u ParseTuple
的位置(ctrl键单击它),并查找以前缀
Py
开头的其他方法,这些方法的名称可能类似于
PyList\u GetItem
。这是python使用的伪OOP命名约定(
PyCATEGORY\u MethodName
)。一旦您看到一些示例代码,就很容易了。遗憾的是,大多数示例代码都是C语言

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

要查找和学习的更多Python API函数:

Py\u BuildValue
-用于返回值

Py_INCREF
Py_DECREF
-对象引用计数所需


您需要知道这里的所有内容。

如果我是您,我会选择用C编写Python扩展。文档假定为C。几乎所有web上的材料都假定为C。我似乎记得P4D不是Python的最新版本。当你在Delphi中编写扩展时,你得到的是带有Pascal语法的C代码,因为底层API是面向C的。为什么它不是最新的?Python3.2是受支持的最新版本。我认为它没有完全覆盖PythonAPI。我错了吗?我不知道,我刚开始:)是的,我知道C-但这是一种自我教育项目,我现在想在德尔福做。那本书看起来像我要找的,很棒。从我的问题中可以看出,我也找到了demo09,但我对Python API感到非常迷茫。使用C编写这些扩展的另一个原因是,您可以研究现有的扩展,然后学习它们读取Python列表、元组、字典、调用Python方法等的技术。见鬼,如果你真的有一些有用的东西要写,它可能已经作为一个C扩展存在了。认真地
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.