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 で書かれています。 Py
PyList_GetItem
PyCATEGORY_MethodName
ツールを使用して、上記の Python コードをサンプル C コードに自動変換し、それを 1 行ずつ Python に変換してみてください。しかし、それは私にとって時間の無駄のように聞こえます。
参照して学習する Python API 関数がいくつかあります。
Py_BuildValue
- 戻り値に便利
Py_INCREF
-Py_DECREF
オブジェクト参照カウントに必要。
ここでは、すべてのメモリ ルールと所有権ルールを知る必要があります。