【Pyhton4Delpi】学习笔记(二)安装验证篇

D12环境下安装P4D。

一、下载 Python4Delphi(下称P4D):

下载地址:https://github.com/pyscripter/python4delphi

下载或者克隆P4D到指定的目录,例如:MDS_New,目录结构如下,P4D就是克隆下来的控件全部目录。

 

二、安装P4D

        首先关闭正在运行的Delphi IDE!                

2.1 自动安装:

        在下载的目录InstallMDS_New\P4D\Install)中,点击 MultiInstaller.exe 进行安装。

提示:

        在安装目录中的Setup.ini中默认定义了安装的目录是在P4D目录下,这一步体现在2.1.2选择的目录之下。例如:2.1.2步骤中选择 D:\MDS_New 则试剂安装在 D:\MDS_New\P4D目录中,如果需要更改这个目录,则需要修改Setup.ini文件。

        强烈建议不要修改,这个安装程序是有问题的,默认安装才可以!

[Package - Python4Delphi]
Name=Python4Delphi
Folder=P4D
SearchPath="Source"
2.1.1 选择需要安装的包,默认可以全部安装

2.1.2 选择需要安装的文件夹:

注意:

        勾选 Compile packages and install on IDE 选项,这样就会安装完成后,在控件面板上显示已经安装好的P4D控件。

        另外注意,这里选择目录是上一级目录,实际默认安装在这一级目录下的P4D目录中。

2.1.3 安装完成,点击:Finish 即可

2.2 手动安装

自动安装和手动安装是完全独立的安装方式,但只需要成功执行一次就可以。对于手动安装,比如已经将P4D克隆到了 D:\MDS_New\P4D 目录中。

2.2.1 打开Delphi IDE
2.2.2 设置搜索路径,增加如下地址
  • D:\MDS_New\P4D\Source
  • D:\MDS_New\P4D\Source\vcl
  • D:\MDS_New\P4D\Source\fmx

2.2.3 打开 D:\MDS_New\P4D\Packages\Delphi\P4DComponentSuite.groupproj 工程组

对于10.4+以上版本就选择10.4+,否则选择10.3-。 选择 Build All

2.2.4 选择  dclPythondclPythonVcl 和 dclPythonFmx 运行时包进行安装

三、查看安装是否成功

        打开Delphi 12,不同的Delphi版本都是可以的,从10.4开始,都是一样的,10.3以下的版本有区别。

        如果看到控件面板上包含P4D的控件,这样就算安装成功了!

四、配置验证运行环境,检测是否真正可用

由于P4D是使用Python和Delphi两种语言,那么正常理解,Python的环境是必须要安装的,但事实上,完整安装了Python的环境当然是没有问题的,但是,如果我们给客户开发了一个软件,还需要开户安装Python开发环境,这就太奢侈了,所以也还有个不需要完整安装Python开发环境的路。

对于完整安装,本文就不多说,对于只需要一个极简安装环境的,说明如下,其实Python的运行环境就是一个DLL和一些lib库,只要这两个有了,就可以运行起来了。

以pythpon38为例:

这个DLLs是如果有Python代码引用到三方的DLL,那么三方的DLL就在这个目录中,如果没有引用到,就可以不需要这个目录。特别注意X32和X64是不同的版本,32位的Python就只能用32位的Delphi,必须对应使用。

做一个Delphi 的程序,然后在写Python代码,就可以尝试运行了,举例:

1. Delphi 程序源代码
unit uMainForm;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons,Vcl.Samples.Spin, Vcl.ExtCtrls,system.Math,System.Threading,System.DateUtils, PythonEngine, Vcl.PythonGUIInputOutput,VarPyth;//PythonEngine, Vcl.PythonGUIInputOutput;typeTForm1 = class(TForm)Splitter1: TSplitter;Panel1: TPanel;Memo1: TMemo;SpeedButton1: TSpeedButton;PythonGUIInputOutput1: TPythonGUIInputOutput;PythonEngine1: TPythonEngine;SpeedButton2: TSpeedButton;PythonModule1: TPythonModule;SpeedButton_LoadDLL: TSpeedButton;OpenDialog1: TOpenDialog;Edit1: TEdit;SpeedButton_UnLoadDLL: TSpeedButton;SpeedButton3: TSpeedButton;Memo2: TMemo;procedure PythonEngine1BeforeLoad(Sender: TObject);procedure SpeedButton1Click(Sender: TObject);procedure SpeedButton2Click(Sender: TObject);procedure PythonModule1Events0Execute(Sender: TObject; PSelf,Args: PPyObject; var Result: PPyObject);procedure SpeedButton_LoadDLLClick(Sender: TObject);procedure SpeedButton_UnLoadDLLClick(Sender: TObject);procedure FormResize(Sender: TObject);procedure PythonModule1Events1Execute(Sender: TObject; PSelf,Args: PPyObject; var Result: PPyObject);procedure SpeedButton3Click(Sender: TObject);procedure FormCreate(Sender: TObject);private{ Private declarations }function IsPrime(n : integer) : Boolean;function CountPrimes(MaxN : Integer) : Integer;public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}{ TForm1 }function TForm1.CountPrimes(MaxN: Integer): Integer;
varCount : integer;
beginTParallel.For(2,MaxN,procedure(i: integer)beginif IsPrime(i) thenAtomicIncrement(Count);end);Result := Count;
end;procedure TForm1.FormCreate(Sender: TObject);
begin{$IFDEF WIN32}{$IFDEF DEBUG}Self.Caption := 'P4D Demo示例 ( Win32 ) Debug';{$ELSE}Self.Caption := 'P4D Demo示例 ( Win32 ) Release';{$ENDIF}{$ELSE}{$IFDEF DEBUG}Self.Caption := 'P4D Demo示例 ( Win64 ) Debug';{$ELSE}Self.Caption := 'P4D Demo示例 ( Win64 ) Release';{$ENDIF}{$ENDIF}
end;procedure TForm1.FormResize(Sender: TObject);
begin//Memo2.Height := Trunc((Self.ClientHeight - Panel1.Height) * 0.7);
end;function TForm1.IsPrime(n: integer): Boolean;
beginif n <= 1 then Exit(False);var q := Floor(Sqrt(n));for var i := 2 to q doif (n mod i = 0) then Exit(False);Exit(True);
end;procedure TForm1.PythonEngine1BeforeLoad(Sender: TObject);
begin//PythonEngine1.SetPythonHome(PythonEngine1.DllPath);   //必须设置这一步
end;procedure TForm1.PythonModule1Events0Execute(Sender: TObject; PSelf,Args: PPyObject; var Result: PPyObject);
varN : integer;
beginwith GetPythonEngine doif PyArg_ParseTuple(Args,'i:delphi_is_prime',@N) <> 0 thenbeginif IsPrime(N) thenResult := PPyObject(Py_True)elseResult := PPyObject(Py_False);Py_INCREF(Result);endelseResult := nil;
end;procedure TForm1.PythonModule1Events1Execute(Sender: TObject; PSelf,Args: PPyObject; var Result: PPyObject);
varN : integer;
beginwith GetPythonEngine doif PyArg_ParseTuple(Args,'i:delphi_count_primes',@N) <> 0 thenbeginResult := PyLong_FromLong(CountPrimes(N));Py_INCREF(Result);endelseResult := nil;
end;procedure TForm1.SpeedButton1Click(Sender: TObject);
beginif not PythonEngine1.Initialized thenbeginMemo1.Lines.Add('请先装载Python DLL');Exit;end;//GetPythonEngine.ExecStrings(SynEdit1.Lines);PythonEngine1.ExecStrings(Memo2.Lines);
end;procedure TForm1.SpeedButton2Click(Sender: TObject);
varaTask: ITask;T    : TDateTime;path : string;PyModule: Variant;
beginif not PythonEngine1.Initialized thenbeginMemo1.Lines.Add('请先装载Python DLL');Exit;end;aTask := TTask.Create(procedurebeginT := Now;TThread.Synchronize(TThread.Current,procedurebeginMemo1.Lines.add('线程运行开始时间: ' + FormatDateTime('hh:mm:ss zzz',T));end);PythonEngine1.ExecStrings(Memo2.Lines);
//      path := 'D:\MDS_New\Demo\camera';
//      PyModule := SysModule;
//      PyModule.path.append(path);
//      PyModule := Import('run');
//      PyModule.start();TThread.Synchronize(TThread.Current,procedurebeginMemo1.Lines.add('线程运行结束时间: ' + FormatDateTime('hh:mm:ss zzz',Now) +  #13#10'线程执行花费时长: ' + (MilliSecondsBetween(Now,T) / 1000).ToString + ' 秒');end);end);aTask.Start;
end;procedure TForm1.SpeedButton3Click(Sender: TObject);
varPyModule: Variant;path : string;
begin{path := 'D:\MDS_New\Demo\camera';PyModule := SysModule;PyModule.path.append(path);PyModule := Import('run');PyModule.start();}//PyModule := Import('hello');//PyModule.SayHello('ABC 你好吗');
end;procedure TForm1.SpeedButton_LoadDLLClick(Sender: TObject);
beginif not OpenDialog1.Execute then Exit;Edit1.Text := OpenDialog1.FileName;//进行运行环境装载PythonEngine1.DllPath := ExtractFilePath(OpenDialog1.FileName);//   'Y:\Documents\sensorwu\Python4Delphi\x86py38';PythonEngine1.DllName := ExtractFileName(OpenDialog1.FileName);PythonEngine1.SetPythonHome(PythonEngine1.DllPath);   //必须设置这一步PythonEngine1.LoadDll;SpeedButton_LoadDLL.Enabled := False;SpeedButton_UnLoadDLL.Enabled := True;
end;procedure TForm1.SpeedButton_UnLoadDLLClick(Sender: TObject);
beginPythonEngine1.UnloadDll;SpeedButton_LoadDLL.Enabled := True;SpeedButton_UnLoadDLL.Enabled := False;
end;end.
2. Python 源代码
#-------------------------------------------------------------------------------
# Name:        module1
# Purpose:     判断素数测试
#
# Author:      wuxihong
#
# Created:     01-02-2024
# Copyright:   (c) wuxihong 2024
# Licence:     <your licence>
#-------------------------------------------------------------------------------#-------- 以下这个包是从delphi 中导入的,打开该引用,同时打开下面的delphi_is_prime实现调用Delphi函数 -------
# ---------- delphi_count_primes 完全使用Delphi的并行计算,速度提高非常多
#from delphi_module import delphi_is_prime
#from delphi_module import delphi_count_primes
#-------------------------------------------
import math
from timeit import Timerdef is_prime(n):if n < 1:return Falseq = math.floor(math.sqrt(n))for i in range(2,q+1):if (n % i == 0):return Falsereturn Truedef count_primes(max_n):res = 0for i in range(2,max_n + 1):#----------- 以下这句是引用 Delphi 包中的函数 delphi_is_prime,打开该语句,屏蔽下面一句 if#if delphi_is_prime(i):#-------------------------------------if is_prime(i):res += 1return resdef test():max_n = 100000print(f'Number of primes between 0 and {max_n} = {count_primes(max_n)}')#----------- 以下这句是引用 Delphi 包中的函数 delphi_count_primes,打开该语句,屏蔽上面一句,即可体会到Delphi的并行运算能力#print(f'Number of primes between 0 and {max_n} = {delphi_count_primes(max_n)}')def main():print(f'Elapsed Time: {Timer(stmt=test).timeit(1)} secs')if __name__ == '__main__':main()
3. 说明

这是一个计算素数个数的演示程序,可以完全通过Python来计算,也可以在Python中调用Delphi的函数来计算,演示了如何设置Python的运行环境。

五、源代码及运行环境(38)下载

1. Delphi 源代码(内涵Python代码)
2. Python38运行环境 

如有任何问题,可以留言交流,因为P4D的资料实在太少,所以需要大家多交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/680952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件开发的201个原则

ISBN: 978-7-121-41997-3 作者&#xff1a;【美】Alan M. Davis 译者&#xff1a;叶王、马学翔、吴斌、王冰清 审定&#xff1a;章淼 页数&#xff1a;344页 阅读时间&#xff1a;2023-09-24 推荐指数&#xff1a;★★★★★ 这本书可以说是集开发之大成者了&#xff0c; 如果你…

OWASP TOP10

OWASP TOP10 OWASP网址&#xff1a;http://ww.owasp.org.cn A01&#xff1a;失效的访问控制 例如&#xff1a;越权漏洞 案例1&#xff1a; 正常&#xff1a;每个人登录教务系统&#xff0c;只能查询自己的成绩信息 漏洞&#xff1a;张三登录后可以查看自己的成绩 例如&…

智胜未来,新时代IT技术人风口攻略-第一版(弃稿)

文章目录 抛砖引玉 鸿蒙生态小科普焦虑之下 理想要落到实处校园鼎力 鸿蒙发展不可挡培训入场 机构急于吃红利企业布局 鸿蒙应用规划动智胜未来 技术人风口来临 鸿蒙已经成为行业的焦点&#xff0c;未来的发展潜力无限。作为一名程序员兼UP主&#xff0c;我非常荣幸地接受了邀请…

基于JAVA的贫困地区人口信息管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 人口信息管理模块2.2 精准扶贫管理模块2.3 特殊群体管理模块2.4 案件信息管理模块2.5 物资补助模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 人口表3.2.2 扶贫表3.2.3 特殊群体表3.2.4 案件表3.2.5 物资补助表 四…

【Java程序设计】【C00251】基于Springboot的医院信息管理系统(有论文)

基于Springboot的医院信息管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的医院信管系统 本系统分为管理员功能模块、系统功能模块以及医生功能模块。 系统功能模块&#xff1a;医院信管系统&#xff0c;…

161基于matlab的快速谱峭度方法

基于matlab的快速谱峭度方法&#xff0c;选择信号峭度最大的频段进行滤波&#xff0c;对滤波好信号进行包络谱分析。输出快速谱峭度及包络谱结果。程序已调通&#xff0c;可直接运行。 161 信号处理 快速谱峭度 包络谱分析 (xiaohongshu.com)

C++初阶之类与对象(中)——六个默认函数详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.前言 二.构造函数 2.1构造函数的语法和特性 2.1.1语法 2.…

Blender教程(基础)-顶点合并-18

一、常规合并 准备&#xff0c;新建一个圆环8个点、全选顶点采用F填充&#xff0c;采用J链接多个顶点如下图所示图形。 选择其中一个顶点 按字母GG、移动到离另外一个顶点更近。再选中两个顶点&#xff0c;右键弹出合并顶点>到中心 二、重叠合并 回退回去 按字母G…

LocalAI 部署(主要针对 mac m2 启动)

LocalAI 部署 介绍 LocalAI 是免费的开源 OpenAI 替代方案。 LocalAI 充当 REST API 的直接替代品&#xff0c;与本地推理的 OpenAI API 规范兼容。 它无需 GPU&#xff0c;还有多种用途集成&#xff0c;允许您使用消费级硬件在本地或本地运行 LLM、生成图像、音频等等&#…

第二节:轻松玩转书生·浦语大模型趣味Demo

参考教程&#xff1a;https://github.com/InternLM/tutorial/blob/main/helloworld/hello_world.md InternLM-Chat-7B 智能对话 Demo 终端运行 web demo 运行 1.首先启动服务&#xff1a; cd /root/code/InternLM streamlit run web_demo.py --server.address 127.0.0.1 --…

普京警告:美元大衰落

来源&#xff1a;Bitcoin.com 编译/作者&#xff1a;秦晋 美元不仅是全球储备货币&#xff0c;也是美国用来维护全球权力的重要武器。甚至还是衡量比特币市值与价格的重要指标之一。比特币富豪的财富指标某种程度上也是通过美元多少来进行衡量的。 2月9日&#xff0c;俄罗斯总统…

(免费领源码)java+SSM+mysql 大学食堂订餐系统APP 75418-计算机毕业设计项目选题推荐

摘 要 本论文主要论述了如何使用SSM框架开发一个大学食堂订餐系统APP&#xff0c;将严格按照软件开发流程进行各个阶段的工作&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述大学食堂订餐系统APP的当前背景以及系统开发的目的&#xff0c;后续章节将…

一、Docker部署MySQL

Docker部署MySQL 一、安装Docker二、拉取MySQL镜像1.选择拉取版本2.拉取镜像 三、启动MySQL1.确定好挂载目录2.启动3.查看是否启动4.开启远程访问权限 一、安装Docker 安装教程&#xff1a;https://qingsi.blog.csdn.net/article/details/131270071 二、拉取MySQL镜像 1.选择…

双指针练习题复写零

复写零 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改&#xff0c;不要从函数返回任何东西。 示例 1&…

【JavaEE进阶】 利用Spring简单实现加法计算器和用户登录

文章目录 &#x1f38d;序言&#x1f333;加法计算器&#x1f6a9;准备工作&#x1f6a9;约定前后端交互接⼝&#x1f332;后端服务器代码的书写 &#x1f334;用户登录&#x1f6a9;效果展示&#x1f6a9;准备工作&#x1f6a9;约定前后端交互接⼝&#x1f388;需求分析&#…

JavaI/O流 File类(目录)

目录 File类目录操作实例 File类目录操作 Java的File类提供了对文件和目录进行操作的方法。对于目录&#xff0c;File类提供了以下一些方法&#xff1a; 判断目录是否存在&#xff1a;使用exists()方法可以判断目录是否存在。创建目录&#xff1a;使用mkdir()或mkdirs()方法可…

16 贪吃蛇

目录 游戏背景游戏效果展示基本功能技术要点WIN32 API介绍设计与分析实现参考代码 1. 游戏背景 贪吃蛇是久负盛名的游戏&#xff0c;是一款经典游戏 2. 效果展示 3. 基本功能 使用c语言在windows环境的控制台模拟实现小游戏贪吃蛇 基本的功能&#xff1a; 地图绘制吃食物上…

MIT-Missing Semester_Topic 3:Editors (Vim) 练习题

文章目录 练习一练习二练习三练习四练习五练习六练习七练习八 本 Topic 的 MIT 讲解网页&#xff08;练习题未给解答&#xff09; 练习一 自行完成 vimtutor。vimtutor 是 Vim 本身附带的一个入门教程&#xff0c;在 shell 中直接输入 vimtutor 便能运行。注意该教程在 8024 大…

【小沐学GIS】基于C++QT绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第二期3【小沐…

QT:实现图片选择器

一、效果图 二、用到的类 qApp&#xff1a;可以快速获取到项目目录位置。 QSettings &#xff1a;编写config文件&#xff0c;记录上次打开图片的位置&#xff0c;下次打开图片会从上次的位置查找图片。 QPixmap&#xff1a;用于图片的缩放&#xff0c;防止图片过小&#xff0…