3

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)

(画像はpythonリストではなく、カスタムオブジェクトです)

Python4Delphi から関連する Demo09 を見つけましたが、そのリストを調べてタプルをアンパックし、値を変更する方法を見つけることができませんでした。

拡張機能を作成するドキュメントへのポインタはありますか?

4

1 に答える 1

8

Python4Delphi は、Python のメイン DLL を Delphi プログラムにロードし、Python インタープリターを Delphi アプリケーションに埋め込む問題を処理しますが、その逆のデモもいくつか用意しています。Delphi を使用して拡張機能を作成します。以下は、いくつかの実際のコード例です。

Delphi を使用して Python 拡張機能を作成するための本のリファレンスを見つけました。Mark Hammond & Andy Robinson (O'Reilly) による Python Programming on Win32 の 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.

実際の拡張ユニット (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()、リストからアイテムを取得するなど。

定義されている場所を探し(Ctrl キーを押しながらクリック)、 のような名前を持つ可能性PyArg_ParseTupleのあるプレフィックスで始まる他のメソッドを探します。これは、python ( ) で使用される疑似 OOP 命名規則です。サンプルコードを見れば、すべてがとても簡単です。悲しいことに、そのサンプル コードのほとんどは C で書かれています。 PyPyList_GetItemPyCATEGORY_MethodName

ツールを使用して、上記の Python コードをサンプル C コードに自動変換し、それを 1 行ずつ Python に変換してみてください。しかし、それは私にとって時間の無駄のように聞こえます。

参照して学習する Python API 関数がいくつかあります。

Py_BuildValue- 戻り値に便利

Py_INCREF-Py_DECREFオブジェクト参照カウントに必要。

ここでは、すべてのメモリ ルールと所有権ルールを知る必要があります。

于 2011-11-23T20:40:53.967 に答える