Skip to content

Commit d26ede5

Browse files
committed
Set VenvPythonExe using PyConfig
PythonHome and ProgramName no longer need to be stored as WCharTString
1 parent 9d4a980 commit d26ede5

File tree

1 file changed

+26
-48
lines changed

1 file changed

+26
-48
lines changed

Source/PythonEngine.pas

Lines changed: 26 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2011,8 +2011,8 @@ TPythonEngine = class(TPythonInterface)
20112011
FClients: TList;
20122012
FExecModule: AnsiString;
20132013
FAutoFinalize: Boolean;
2014-
FProgramName: WCharTString;
2015-
FPythonHome: WCharTString;
2014+
FProgramName: UnicodeString;
2015+
FPythonHome: UnicodeString;
20162016
FPythonPath: WCharTString;
20172017
FInitThreads: Boolean;
20182018
FOnPathInitialization: TPathInitializationEvent;
@@ -2033,8 +2033,6 @@ TPythonEngine = class(TPythonInterface)
20332033
FPyDateTime_TZInfoType: PPyObject;
20342034
FPyDateTime_TimeTZType: PPyObject;
20352035
FPyDateTime_DateTimeTZType: PPyObject;
2036-
function GetPythonHome: UnicodeString;
2037-
function GetProgramName: UnicodeString;
20382036
function GetPythonPath: UnicodeString;
20392037
procedure SetPythonPath(const Value: UnicodeString);
20402038

@@ -2074,7 +2072,6 @@ TPythonEngine = class(TPythonInterface)
20742072
function Run_CommandAsObjectWithDict(const command: AnsiString; mode: Integer; locals, globals: PPyObject; const FileName: string = '<string>'): PPyObject;
20752073
function EncodeString (const str: UnicodeString): AnsiString; {$IFDEF FPC}overload;{$ENDIF}
20762074
{$IFDEF FPC}
2077-
overload;
20782075
function EncodeString (const str: AnsiString): AnsiString; overload;
20792076
{$ENDIF}
20802077
function EncodeWindowsFilePath(const str: string): AnsiString;
@@ -2157,8 +2154,8 @@ TPythonEngine = class(TPythonInterface)
21572154
property LocalVars : PPyObject read FLocalVars Write SetLocalVars;
21582155
property GlobalVars : PPyObject read FGlobalVars Write SetGlobalVars;
21592156
property IOPythonModule: TObject read FIOPythonModule; {TPythonModule}
2160-
property PythonHome: UnicodeString read GetPythonHome write SetPythonHome;
2161-
property ProgramName: UnicodeString read GetProgramName write SetProgramName;
2157+
property PythonHome: UnicodeString read FPythonHome write SetPythonHome;
2158+
property ProgramName: UnicodeString read FProgramName write SetProgramName;
21622159
property PythonPath: UnicodeString read GetPythonPath write SetPythonPath;
21632160
published
21642161
property AutoFinalize: Boolean read FAutoFinalize write FAutoFinalize default True;
@@ -2992,6 +2989,7 @@ procedure PythonVersionFromDLLName(LibName: string; out MajorVersion, MinorVersi
29922989
function PythonVersionFromRegVersion(const ARegVersion: string;
29932990
out AMajorVersion, AMinorVersion: integer): boolean;
29942991
function PyStatus_Exception(const APyStatus: PyStatus): Boolean;
2992+
function StringToWCharTString(Str: string): WcharTString;
29952993

29962994
//#######################################################
29972995
//## ##
@@ -4692,19 +4690,7 @@ procedure TPythonEngine.Initialize;
46924690
procedure InitSysPath;
46934691
var
46944692
_path : PPyObject;
4695-
const Script =
4696-
'import sys' + sLineBreak +
4697-
'sys.executable = r"%s"' + sLineBreak +
4698-
'path = sys.path' + sLineBreak +
4699-
'for i in range(len(path)-1, -1, -1):' + sLineBreak +
4700-
' if path[i].find("site-packages") > 0:' + sLineBreak +
4701-
' path.pop(i)' + sLineBreak +
4702-
'import site' + sLineBreak +
4703-
'site.main()' + sLineBreak +
4704-
'del sys, path, i, site';
47054693
begin
4706-
if VenvPythonExe <> '' then
4707-
ExecString(AnsiString(Format(Script, [VenvPythonExe])));
47084694
_path := PySys_GetObject('path');
47094695
if Assigned(FOnSysPathInit) then
47104696
FOnSysPathInit(Self, _path);
@@ -4788,11 +4774,18 @@ procedure TPythonEngine.Initialize;
47884774
AssignPyFlags(Config);
47894775

47904776
// Set programname and pythonhome if available
4791-
if Length(FProgramName) > 0 then
4792-
PyConfig_SetString(Config, @Config.program_name, PWCharT(FProgramName));
4793-
if Length(FPythonHome) > 0 then
4794-
PyConfig_SetString(Config, @Config.program_name, PWCharT(FPythonHome));
4795-
4777+
if FProgramName <> '' then
4778+
PyConfig_SetString(Config, @Config.program_name,
4779+
PWCharT(StringToWCharTString(FProgramName)));
4780+
if FPythonHome <> '' then
4781+
PyConfig_SetString(Config, @Config.program_name,
4782+
PWCharT(StringToWCharTString(FPythonHome)));
4783+
// Set venv executable if available
4784+
if FVenvPythonExe <> '' then
4785+
PyConfig_SetString(Config, @Config.program_name,
4786+
PWCharT(StringToWCharTString(FVenvPythonExe)));
4787+
4788+
PyConfig_Read(Config);
47964789
// Set program arguments (sys.argv)
47974790
SetProgramArgs(Config);
47984791

@@ -5025,18 +5018,6 @@ procedure TPythonEngine.SetPyFlags(const Value: TPythonFlags);
50255018
end; // of if
50265019
end;
50275020

5028-
function TPythonEngine.GetPythonHome: UnicodeString;
5029-
begin
5030-
{$IFDEF POSIX}
5031-
if Length(FPythonHome) = 0 then
5032-
Result := ''
5033-
else
5034-
Result := UCS4StringToUnicodeString(FPythonHome);
5035-
{$ELSE}
5036-
Result := FPythonHome;
5037-
{$ENDIF}
5038-
end;
5039-
50405021
function TPythonEngine.GetPythonPath: UnicodeString;
50415022
begin
50425023
{$IFDEF POSIX}
@@ -5062,18 +5043,6 @@ function TPythonEngine.GetSequenceItem(sequence: PPyObject;
50625043
end;
50635044
end;
50645045

5065-
function TPythonEngine.GetProgramName: UnicodeString;
5066-
begin
5067-
{$IFDEF POSIX}
5068-
if Length(FProgramName) = 0 then
5069-
Result := ''
5070-
else
5071-
Result := UCS4StringToUnicodeString(FProgramName);
5072-
{$ELSE}
5073-
Result := FProgramName;
5074-
{$ENDIF}
5075-
end;
5076-
50775046
procedure TPythonEngine.SetPythonHome(const PythonHome: UnicodeString);
50785047
begin
50795048
{$IFDEF POSIX}
@@ -9916,6 +9885,15 @@ function PyStatus_Exception(const APyStatus: PyStatus): Boolean;
99169885
Result := APyStatus._type <> _PyStatus_TYPE_OK;
99179886
end;
99189887

9888+
function StringToWCharTString(Str: string): WcharTString;
9889+
begin
9890+
{$IFDEF POSIX}
9891+
Result := UnicodeStringToUCS4String(UnicodeString(Str));
9892+
{$ELSE}
9893+
Result := Str;
9894+
{$ENDIF}
9895+
end;
9896+
99199897
{ TPyEngineAndGIL - Internal class for SafePythonEngine }
99209898

99219899
type

0 commit comments

Comments
 (0)