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
😓。。。