-
Notifications
You must be signed in to change notification settings - Fork 30.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Accept Python 3 on Windows #29236
Closed
Closed
Accept Python 3 on Windows #29236
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,59 +1,108 @@ | ||
@IF NOT DEFINED DEBUG_HELPER @ECHO OFF | ||
echo Looking for Python 2.x | ||
SETLOCAL | ||
:: If python.exe is in %Path%, just validate | ||
|
||
echo Looking for Python | ||
setlocal enabledelayedexpansion | ||
|
||
:: To remove the preference for Python 2, but still support it, just remove | ||
:: the 5 blocks marked with "Python 2:" and the support warnings | ||
|
||
:: Python 2: If python.exe is in %Path%, use if it's Python 2 | ||
FOR /F "delims=" %%a IN ('where python.exe 2^> NUL') DO ( | ||
SET need_path=0 | ||
SET p=%%~dpa | ||
IF NOT ERRORLEVEL 1 GOTO :validate | ||
CALL :validate-v2 | ||
IF NOT ERRORLEVEL 1 GOTO :found-python2 | ||
GOTO :done-path-v2 | ||
) | ||
:done-path-v2 | ||
|
||
:: Query the 3 locations mentioned in PEP 514 for a python2 InstallPath | ||
:: Python 2: 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 | ||
:: If validate returns 0 just jump to the end | ||
IF NOT ERRORLEVEL 1 GOTO :validate | ||
CALL :find-versions-v2 %%K | ||
IF NOT ERRORLEVEL 1 CALL :validate-v2 | ||
IF NOT ERRORLEVEL 1 GOTO :found-python2 | ||
) | ||
|
||
:: Use python.exe if in %PATH% | ||
set need_path=0 | ||
for /f "delims=" %%a in ('where python.exe 2^> nul') do ( | ||
set p=%%~dpa | ||
goto :found-python | ||
) | ||
|
||
:: Query the 3 locations mentioned in PEP 514 for a Python InstallPath | ||
set need_path=1 | ||
for %%k in ( "HKCU\Software", "HKLM\SOFTWARE", "HKLM\Software\Wow6432Node") do ( | ||
call :find-versions %%k | ||
if not errorlevel 1 goto :found-python | ||
) | ||
|
||
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 | ||
|
||
:: Python 2: 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 | ||
|
||
:: Check if %p% holds a path to a real python2 executable | ||
:validate | ||
IF NOT EXIST "%p%python.exe" goto :no-python | ||
:: Find Python installations in a registry location | ||
:find-versions | ||
for /f "delims=" %%a in ('reg query "%~1\Python\PythonCore" /f * /k 2^> nul ^| findstr /r ^^HK') do ( | ||
call :read-installpath %%a | ||
if not errorlevel 1 exit /b 0 | ||
) | ||
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 | ||
|
||
|
||
:: Python 2: Check if %p% holds a path to a real python2 executable | ||
:validate-v2 | ||
IF NOT EXIST "%p%\python.exe" EXIT /B 1 | ||
:: Check if %p% is python2 | ||
"%p%python.exe" -V 2>&1 | findstr /R "^Python.2.*" > NUL | ||
IF ERRORLEVEL 1 goto :no-python2 | ||
:: We can wrap it up | ||
ENDLOCAL & SET pt=%p%& SET need_path_ext=%need_path% | ||
SET VCBUILD_PYTHON_LOCATION=%pt%python.exe | ||
IF %need_path_ext%==1 SET Path=%Path%;%pt% | ||
SET need_path_ext= | ||
"%p%\python.exe" -V 2>&1 | findstr /R "^Python.2.*" > NUL | ||
EXIT /B %ERRORLEVEL% | ||
|
||
:no-python2 | ||
echo Python found in %p%, but it is not v2.x. | ||
exit /B 1 | ||
|
||
:: Python 2: | ||
:found-python2 | ||
echo Python 2 found in %p%\python.exe | ||
set pyver=2 | ||
goto :done | ||
|
||
:found-python | ||
echo Python found in %p%\python.exe | ||
echo WARNING: Python 3 is not yet fully supported, to avoid issues Python 2 should be installed. | ||
set pyver=3 | ||
goto :done | ||
|
||
:done | ||
endlocal ^ | ||
& set "pt=%p%" ^ | ||
& set "need_path_ext=%need_path%" ^ | ||
& set "VCBUILD_PYTHON_VERSION=%pyver%" | ||
set "VCBUILD_PYTHON_LOCATION=%pt%\python.exe" | ||
if %need_path_ext%==1 set "PATH=%pt%;%PATH%" | ||
set "pt=" | ||
set "need_path_ext=" | ||
exit /b 0 | ||
|
||
:no-python | ||
echo Could not find Python. | ||
exit /B 1 | ||
exit /b 1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit that can totally be ignored, especially since this message eventually will go away anyway.