Skip to content

Commit

Permalink
build,win: find Python in paths with spaces
Browse files Browse the repository at this point in the history
When looking for Python in the registry, as specified in PEP514,
this was not able to handle installations in a path with spaces,
like Program Files. This ensures the whole path is used, fixing the
issue.

PR-URL: #29236
Reviewed-By: Christian Clauss <cclauss@me.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
  • Loading branch information
joaocgreis authored and Trott committed Sep 3, 2019
1 parent ab841d5 commit eba72ac
Showing 1 changed file with 27 additions and 21 deletions.
48 changes: 27 additions & 21 deletions tools/msvs/find_python.cmd
@@ -1,6 +1,8 @@
@IF NOT DEFINED DEBUG_HELPER @ECHO OFF

echo Looking for Python 2.x
SETLOCAL
setlocal enabledelayedexpansion

:: If python.exe is in %Path%, just validate
FOR /F "delims=" %%a IN ('where python.exe 2^> NUL') DO (
SET need_path=0
Expand All @@ -11,32 +13,36 @@ FOR /F "delims=" %%a IN ('where python.exe 2^> NUL') DO (
:: Query the 3 locations mentioned in PEP 514 for a python2 InstallPath
FOR %%K IN ( "HKCU\Software", "HKLM\SOFTWARE", "HKLM\Software\Wow6432Node") DO (
SET need_path=1
CALL :find-main-branch %%K
CALL :find-versions-v2 %%K
:: If validate returns 0 just jump to the end
IF NOT ERRORLEVEL 1 GOTO :validate
)

goto :no-python

:: Helper subroutine to handle quotes in %1
:find-main-branch
SET main_key="%~1\Python\PythonCore"
REG QUERY %main_key% /s 2> NUL | findstr "2." | findstr InstallPath > NUL 2> NUL
IF NOT ERRORLEVEL 1 CALL :find-key %main_key%
EXIT /B

:: Query registry sub-tree for InstallPath
:find-key
FOR /F "delims=" %%a IN ('REG QUERY %1 /s 2^> NUL ^| findstr "2." ^| findstr InstallPath') DO IF NOT ERRORLEVEL 1 CALL :find-path %%a
EXIT /B

:: Parse the value of %1 as the path for python.exe
:find-path
FOR /F "tokens=3*" %%a IN ('REG QUERY %1 /ve') DO (
SET pt=%%a
IF NOT ERRORLEVEL 1 SET p=%pt%
EXIT /B 0

:: Find Python 2 installations in a registry location
:find-versions-v2
for /f "delims=" %%a in ('reg query "%~1\Python\PythonCore" /f * /k 2^> nul ^| findstr /r ^^HK ^| findstr "\\2\."') do (
call :read-installpath %%a
if not errorlevel 1 exit /b 0
)
EXIT /B 1
exit /b 1

:: Read the InstallPath of a given Environment Key to %p%
:: https://www.python.org/dev/peps/pep-0514/#installpath
:read-installpath
:: %%a will receive token 3
:: %%b will receive *, corresponding to token 4 and all after
for /f "skip=2 tokens=3*" %%a in ('reg query "%1\InstallPath" /ve /t REG_SZ 2^> nul') do (
set "head=%%a"
set "tail=%%b"
set "p=!head!"
if not "!tail!"=="" set "p=!head! !tail!"
exit /b 0
)
exit /b 1


:: Check if %p% holds a path to a real python2 executable
:validate
Expand Down

0 comments on commit eba72ac

Please sign in to comment.