@@ -37,6 +37,7 @@ TPythonVersion = record
3737 DLLPath: string;
3838 InstallPath: string;
3939 PythonPath: string;
40+ function Is_venv : Boolean;
4041 procedure AssignTo (PythonEngine: TPersistent);
4142 property PythonExecutable: string read GetPythonExecutable;
4243 property DLLName: string read GetDLLName;
@@ -58,6 +59,8 @@ TPythonVersion = record
5859
5960
6061 { $IFDEF MSWINDOWS}
62+ (* Checks whether an executable was compiled for X64 *)
63+ function IsEXEx64 (const EXEName: string): Boolean;
6164 (* Checks whether a DLL was compiled for X64 *)
6265 function Isx64 (const FileName: string): Boolean;
6366 (* Checks whether a Python version is registered and returns the related info *)
@@ -110,7 +113,8 @@ function TPythonVersion.ExpectedArchitecture: string;
110113
111114procedure TPythonVersion.AssignTo (PythonEngine: TPersistent);
112115begin
113- if PythonEngine is TPythonEngine then begin
116+ if PythonEngine is TPythonEngine then
117+ begin
114118 TPythonEngine(PythonEngine).UseLastKnownVersion := False;
115119 TPythonEngine(PythonEngine).RegVersion := SysVersion;
116120 TPythonEngine(PythonEngine).DllName := DLLName;
@@ -177,6 +181,16 @@ function TPythonVersion.GetSysArchitecture: string;
177181 Result := ' Unknown' ;
178182end ;
179183
184+ function TPythonVersion.Is_venv : Boolean;
185+ {
186+ Check weather this is python venv folder introduced in python 3.5
187+ Note: venv is different from virtualenv
188+ }
189+ begin
190+ Result := not IsRegistered and (InstallPath <> DLLPath) and
191+ FileExists(IncludeTrailingPathDelimiter(InstallPath) + ' pyvenv.cfg' );
192+ end ;
193+
180194function CompareVersions (A, B : String) : Integer;
181195
182196 function GetNextNumber (var Version: string): Integer;
@@ -220,6 +234,15 @@ function CompareVersions(A, B : String) : Integer;
220234end ;
221235
222236{ $IFDEF MSWINDOWS}
237+ function IsEXEx64 (const EXEName: string): Boolean;
238+ var
239+ BinaryType: DWORD;
240+ begin
241+ Result := FileExists(EXEName) and
242+ GetBinaryType(PChar(ExeName), Binarytype) and
243+ (BinaryType = SCS_64BIT_BINARY);
244+ end ;
245+
223246function Isx64 (const FileName: string): Boolean;
224247var
225248 Strm : TFileStream;
@@ -374,7 +397,7 @@ function PythonVersionFromPath(const Path: string; out PythonVersion: TPythonVer
374397 DLLFileName: string;
375398 begin
376399 Result := ' ' ;
377- Handle := FindFirstFile(PWideChar(Path +' \python??.dll' ), FindFileData);
400+ Handle := FindFirstFile(PWideChar(APath +' \python??.dll' ), FindFileData);
378401 if Handle = INVALID_HANDLE_VALUE then Exit; // not python dll
379402 DLLFileName:= FindFileData.cFileName;
380403 // skip if python3.dll was found
@@ -408,7 +431,7 @@ function PythonVersionFromPath(const Path: string; out PythonVersion: TPythonVer
408431
409432 // check if same platform
410433 try
411- if { $IFDEF CPUX64} not { $ENDIF} Isx64 (DLLPath+' \' +DLLFileName ) then Exit;
434+ if { $IFDEF CPUX64} not { $ENDIF} IsEXEx64 (DLLPath+' \python.exe ' ) then Exit;
412435 except
413436 Exit;
414437 end ;
0 commit comments