python4delphi 的使用方法简介
Python4Delphi (P4D) 是一组免费的 Delphi 组件,它允许你:
- 在 Delphi 应用中嵌入 Python 解释器
- 在 Python 中使用 Delphi 的类和对象
- 双向调用:Delphi ↔ Python
核心组件:
TPythonEngine- Python 解释器引擎TPythonModule- 创建 Python 模块TPythonType- 定义 Python 类型TPythonDelphiVar- Delphi 变量与 Python 共享
第二步:基础 Demo - 最简单的 "Hello World"
2.1 界面准备
在 Delphi 中新建 VCL 应用,放置以下组件:
TPythonEngine(来自 Python4Delphi 组件面板)TMemo(显示输出,命名为 MemoOutput)TButton(执行按钮)
uses
PythonEngine;
procedure TForm1.Button1Click(Sender: TObject);
var
PyEng:TPythonEngine;
result:PPyObject;
begin
PyEng:=TPythonEngine.Create(self); // 开始创建python引擎
PyEng.DllName:='Python38.dll';
PyEng.DllPath:='D:\Python\Python38-32\';
PyEng.LoadDll(); // 如果在窗口中放置了TPythonEngine控件,就不需要这段初始化python引擎的代码。
PyEng.ExecString('import sys'); // 执行没有返回值的python语句
result:=PyEng.EvalString('sys.version'); // 执行有返回值的语句
//result:=PyEng.EvalString('import sys; sys.version'); //不支持这种写法
Memo1.Lines.Add(PyEng.PyObjectAsString( result));
end;| 代码段 | 作用 | 关键点 |
| ------- | ------------------- | --------------------------------------- |
| 第2段 | 执行 Python 语句 | `ExecString` 用于执行不返回值的代码 |
| 第3段 | 获取 Python 信息 | `EvalString` 用于获取表达式返回值 |
Delphi 向 Python 传递变量
procedure TForm1.PassValuesToPython;
var
PyValue: PPyObject; //python对象指针
begin
// 第一步:创建python整数
PyValue:=PyEng.PyLong_FromLong(100);
//第二步:把变量注入python全局命名空间
PyEng.PyDict_SetItemString(PyEng.PyModule_GetDict(PyEng.GetMainModule()), 'delphi_number',PyValue);
// 第三步:在python中使用变量
PyEng.ExecString('print(f"Delphi传进来的数字是:{delphi_number}")');
// 第四步:必须释放变量,防止内存泄露
PyEng.Py_DECREF(PyValue);
end;关键概念解释:
PPyObject- Python 对象的 C 指针,所有 Python 数据都是这种类型PyLong_FromLong()- 将 Delphi 整数转为 Python 整数PyEng.GetMainModule()获取主模块
PyEng.PyModule_GetDict()获取Python 的全局变量字典
Py_DecRef()- 必须调用,减少引用计数,否则内存泄漏
使用 TPythonDelphiVar 组件
这是更简单的数据交换方式,不需要手动管理引用计数。
界面设置
//添加 TPythonDelphiVar 组件,设置 VarName = "delphi_var"
procedure TForm1.UseDelphiVar;
begin
PythonEngine1.LoadDll;
// 【第1段】通过组件赋值(自动处理类型转换)
PythonDelphiVar1.Value := '来自 Delphi 的字符串';
// 【第2段】Python 中直接使用这个变量名
PythonEngine1.ExecString('print(delphi_var.upper())');
// 【第3段】Python 修改后,Delphi 读取
PythonEngine1.ExecString('delphi_var = "被 Python 修改了"');
ShowMessage(PythonDelphiVar1.Value); // 显示修改后的值
end;优势:
- ✅ 自动内存管理
- ✅ 自动类型转换(字符串、整数、浮点数、布尔值)
- ✅ 双向实时同步
创建 Python 可调用的 Delphi 函数
这是 P4D 最强大的功能 - 让 Python 调用你的 Delphi 代码。
//定义函数包装器 uses PythonEngine, MethodCallBack;// 【第1段】定义 Delphi 函数(必须符合特定签名)function AddNumbers(Self, Args: PPyObject): PPyObject; cdecl;var A, B: Integer;begin with GetPythonEngine do begin // 解析 Python 传来的参数 (两个整数) if PyArg_ParseTuple(Args, 'ii:AddNumbers', @A, @B) <> 0 then begin // 返回两数之和 Result := PyLong_FromLong(A + B); end else Result := nil; // 解析失败返回 nil end;end;
//注册函数到 Pythonprocedure TForm1.RegisterDelphiFunction;begin
PythonEngine1.LoadDll;
// 【第2段】创建 Python 模块
with PythonModule1 do // TPythonModule 组件
begin
ModuleName := 'delphi_utils'; // Python 中 import 的名字
// 添加方法: 方法名, 函数指针, 文档字符串
AddMethod('add', @AddNumbers, 'Add two integers: add(a, b) -> int');
// 【第3段】必须调用,实际注册到 Python Initialize; end;
// 【第4段】Python 中调用 Delphi 函数 PythonEngine1.ExecString( 'import delphi_utils' + sLineBreak + 'result = delphi_utils.add(10, 20)' + sLineBreak + 'print(f"10 + 20 = {result}")'
);end;| PyArg_ParseTuple | 解析 Python 参数,`'ii'` 表示两个整数 |
| cdecl | 必须指定,匹配 Python C API 调用约定 |
| ModuleName | Python 中 `import` 使用的模块名 |
| AddMethod | 将 Delphi 函数暴露给 Python |
5.
//操作 Python 列表procedure TForm1.WorkWithPythonList;var
PyList, PyItem: PPyObject;
I: Integer;begin
PythonEngine1.LoadDll;
// 【第1段】创建 Python 列表
PyList := PythonEngine1.PyList_New(0); // 空列表
// 【第2段】向列表添加元素
for I := 1 to 5 do
begin
PyItem := PythonEngine1.PyLong_FromLong(I * 10);
PythonEngine1.PyList_Append(PyList, PyItem);
PythonEngine1.Py_DecRef(PyItem); // 列表已引用,可以释放临时引用
end;
// 【第3段】将列表注入 Python PythonEngine1.PyDict_SetItemString(
PythonEngine1.GetMainModule.__dict__, 'my_list',
PyList
);
PythonEngine1.Py_DecRef(PyList);
// 【第4段】Python 中使用列表 PythonEngine1.ExecString( 'print(f"列表: {my_list}")' + sLineBreak + 'print(f"总和: {sum(my_list)}")'
);end;
网友留言(0 条)