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,查看当前的信息:

229308-20190514212134224-176614257.png

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

229308-20190514212506592-299536565.png

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

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

conda create -n python32bit python=3.6

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

229308-20190514213138992-1137632209.png

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

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

229308-20190514213446429-1362218698.png

229308-20190514213520660-2144493915.png

汇编不会啊,看不懂

看不懂也要跟踪下,哪哪出问题了,嗯,是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

😓。。。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐