• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

折腾python4delphi

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

python4delphi有更新了,支持最新的python(python3.7)和delphi(10.3)。

 git上下载更新的python4delphi,然后安装控件,打开demo1,

提示不能打开python27.dll,这个,我电脑上的是3.6,肯定不行,改TPythonEngine控件的DllPath,DllName,RegVersion( 这个属性可以不管)。。。运行,还是不行,还是装载了'python27.dll',奇怪了,跟踪,原来是PythonEngine的UseLastKnowVersion属性作怪,设置UseLastKnowVersion为False,运行,还是不能打开,现在的DLL名称是'python36.dll'了,怎么不能打开呢,跟踪,就是SafeLoadLibary()出问题,这是dll不对了,怎么回事。。。乱点鼠标中。。。win32,win64, 想起了,我的python是64bit的!!!这个Demo是32bit,切换成64,编译不了,嗯,我只是安装了32BIT的控件,没安装编译64BIT的。。。64BIT的怎么编译安装,打开控件包,切换64BIT,各种错误。。。

(这里顺便记下:delphi里的32/64是指支持运行在32/64,但是,delphi IDE 本身是32bit,所以,没有64BIT的设计时控件,只有'运行时'的64BIT控件,也就是说,控件支持32/64,是在运行时支持64,设计时永远是32,所以设计时控件不要在64BIT下编译,试试就知道了,在64BIT下,控件是没有安装这个选项的)

纠结了下,还是转个32BIT的PYTHON吧,万一以后还有其它的需求32BIT的PYTHON呢,装,网上索了下,ANCONDA3下同时安装64bit和32bit的python,照着做:

这里重复记录下:

在anaconda Prompt 下, conda info,查看当前的信息:

首先切换到Window 32BIT平台:set CONDA_FORCE_32BIT=1

这就是32BIT了,然后要在这个环境下安装(网上说在这个情况下,也不能用anaconda navigator的界面来安装,只能在COMMAND PROMPT下安装)

为了和64BIT的共存,32BIT的安装要建立一个新环境:

conda create -n python32bit python=3.6

然后安装,安装完后会在python的env 下有个新目录 python32bit

 

好了,python32BIT安装好了,再去试python4delphi

打开DEMO,修改Dllpath,运行,直接崩溃。。。。

 

 

 

 汇编不会啊,看不懂

看不懂也要跟踪下,哪哪出问题了,嗯,是python的Py_Initialize()出问题,这行代码

  Py_Initialize             := Import('Py_Initialize');

咋办呢,万能的互联网啊(哪天不能上网,那是不是也活的差不多了)

网上说,一般出这个问题,是python的路径出问题了,系统环境变量里找不着python了,哦,是这样,但是我不能设置python32路径在系统变量里啊,不能为了python4delphi而毁了其它的千千万万的python代码。。。(我的系统里是不设置python路径的环境变量的,因为不是固定一个python版本)

网上说,2个办法:

“两个方法:

一个就是补全python的环境变量。

另一个就是手动设置初始化函数的搜寻路径(也就是加载路径)”

真好,可以手动临时设置,就是这个python函数Py_SetPythonHome()

那python4delphi里在哪设置呢,嗯,刚才跟踪的时候看到了

    procedure  SetPythonHome(const PythonHome: string); 

是个public方法,为什么不publish成属性啊?

呵,这个PathHome和DLLPath一样,然后在那里调用这个方法啊,还是跟踪的时候看到了几个个事件,OnAfterLoad和 OnBeforLoad,是在Py_Initialize()前调用的,正正好,设置TPythonEngine的OnAfterLoad或OnBeforLoad:

procedure TForm1.PythonEngine1AfterLoad(Sender: TObject);
begin
PythonEngine1.SetPythonHome(PythonEngine1.DllPath);
end;

感觉这个更好

procedure TForm1.PythonEngine1BeforeLoad(Sender: TObject);
begin
PythonEngine1.SetPythonHome(PythonEngine1.DllPath);
end;

给我起吧,运行好了。。。。

不过demo1 例子会提示错误啊,不过这个错误表明了运行正确,因为,语句print 2+2,这是python2的,改成print(2+2),OK

????。。。

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap