forked from Embarcadero/python4delphi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPythonLoad.pas
More file actions
135 lines (114 loc) · 5.13 KB
/
Copy pathPythonLoad.pas
File metadata and controls
135 lines (114 loc) · 5.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
(**************************************************************************)
(* *)
(* Module: Unit 'PythonLoad' Copyright (c) 2021 *)
(* *)
(* Lucas Moura Belo - lmbelo *)
(* lucas.belo@live.com *)
(* BH, Brazil *)
(* *)
(* PyScripter *)
(* e-mail: pyscripter@gmail.com *)
(* *)
(* Project pages: https://github.com/Embarcadero/python4delphi *)
(* https://github.com/pyscripter/python4delphi *)
(**************************************************************************)
(* Functionality: Load python distribution *)
(* *)
(* *)
(**************************************************************************)
(* This source code is distributed with no WARRANTY, for no reason or use.*)
(* Everyone is allowed to use and change this code free for his own tasks *)
(* and projects, as long as this header and its copyright text is intact. *)
(* For changed versions of this code, which are public distributed the *)
(* following additional conditions have to be fullfilled: *)
(* 1) The header has to contain a comment on the change and the author of *)
(* it. *)
(* 2) A copy of the changed source has to be sent to the above E-Mail *)
(* address or my then valid address, if this is possible to the *)
(* author. *)
(* The second condition has the target to maintain an up to date central *)
(* version of the component. If this condition is not acceptable for *)
(* confidential or legal reasons, everyone is free to derive a component *)
(* or to generate a diff file to my or other original sources. *)
(**************************************************************************)
unit PythonLoad;
interface
uses
System.SysUtils, System.Zip, PythonEngine;
type
TExtractEvent = reference to procedure(const AFolderExists: boolean; var AReplaceFiles: boolean);
TPythonLoad = class
public
class function GetPyZip(): string; static;
class function GetPyRoot(): string; static;
class function GetPyHome(): string; static;
class function GetPyBin(): string; static;
class function GetPyLib(): string; static;
class function HasPythonLib(): boolean; static;
class function HasPythonZip(): boolean; static;
class function HasPythonDist(): boolean; static;
class procedure Extract(); static;
class procedure Configure(const APythonEngine: TPythonEngine); static;
end;
implementation
uses
System.IOUtils;
const
PY_KNOWN_VER = 1;
{ TPythonLoad }
class procedure TPythonLoad.Extract();
begin
var LPyRoot := TPythonLoad.GetPyRoot();
var LPyZip := TPythonLoad.GetPyZip();
if not TDirectory.Exists(LPyRoot) then
TZipFile.ExtractZipFile(LPyZip, LPyRoot, nil);
end;
class function TPythonLoad.GetPyBin: string;
begin
Result := TPath.Combine(GetPyHome(), 'bin');
end;
class function TPythonLoad.GetPyHome: string;
begin
Result := TPath.Combine(GetPyRoot(), 'usr');
end;
class function TPythonLoad.GetPyLib: string;
begin
Result := TPath.Combine(GetPyHome(), 'lib');
end;
class function TPythonLoad.GetPyRoot: string;
begin
Result := TPath.Combine(TPath.GetDocumentsPath(), 'build');
end;
class function TPythonLoad.GetPyZip: string;
begin
Result := TPath.Combine(TPath.GetDocumentsPath(), 'build.zip');
end;
class function TPythonLoad.HasPythonDist: boolean;
begin
Result := TDirectory.Exists(TPythonLoad.GetPyRoot());
end;
class function TPythonLoad.HasPythonLib: boolean;
begin
Result := TFile.Exists(TPath.Combine(TPath.GetLibraryPath(),
PYTHON_KNOWN_VERSIONS[PY_KNOWN_VER].DllName));
end;
class function TPythonLoad.HasPythonZip: boolean;
begin
Result := TFile.Exists(TPythonLoad.GetPyZip());
end;
class procedure TPythonLoad.Configure(const APythonEngine: TPythonEngine);
begin
APythonEngine.AutoLoad := False;
APythonEngine.UseLastKnownVersion := false;
APythonEngine.ProgramName := TPythonLoad.GetPyBin();
APythonEngine.PythonHome := TPythonLoad.GetPyHome();
APythonEngine.RegVersion := PYTHON_KNOWN_VERSIONS[PY_KNOWN_VER].RegVersion;
APythonEngine.DllName := PYTHON_KNOWN_VERSIONS[PY_KNOWN_VER].DllName;
APythonEngine.APIVersion := PYTHON_KNOWN_VERSIONS[PY_KNOWN_VER].APIVersion;
APythonEngine.FatalAbort := False;
APythonEngine.FatalMsgDlg := False;
APythonEngine.AutoFinalize := True;
APythonEngine.InitThreads := True;
APythonEngine.PyFlags := [pfInteractive];
end;
end.