diff --git a/.gitignore b/.gitignore
index 5221fd75463..c7db0c7687b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -80,4 +80,5 @@ tags
TAGS
.coverage
coverage/
+externals/
htmlcov/
diff --git a/.hgignore b/.hgignore
index 562dac96f83..e22a8f7c4ca 100644
--- a/.hgignore
+++ b/.hgignore
@@ -93,6 +93,7 @@ Programs/_freeze_importlib
Programs/_testembed
.coverage
coverage/
+externals/
htmlcov/
*.gcda
*.gcno
diff --git a/Lib/tkinter/_fix.py b/Lib/tkinter/_fix.py
index 5f32d25abc8..fa88734c052 100644
--- a/Lib/tkinter/_fix.py
+++ b/Lib/tkinter/_fix.py
@@ -48,8 +48,8 @@ def convert_path(s):
prefix = os.path.join(sys.base_prefix,"tcl")
if not os.path.exists(prefix):
- # devdir/../tcltk/lib
- prefix = os.path.join(sys.base_prefix, os.path.pardir, "tcltk", "lib")
+ # devdir/externals/tcltk/lib
+ prefix = os.path.join(sys.base_prefix, "externals", "tcltk", "lib")
prefix = os.path.abspath(prefix)
# if this does not exist, no further search is needed
if os.path.exists(prefix):
diff --git a/Misc/NEWS b/Misc/NEWS
index 3f62b97e2f7..56e1da49f20 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -1385,6 +1385,9 @@ Tools/Demos
Windows
-------
+- Issue #17896: The Windows build scripts now expect external library sources
+ to be in ``PCbuild\..\externals`` rather than ``PCbuild\..\..``.
+
- Issue #17717: The Windows build scripts now use a copy of NASM pulled from
svn.python.org to build OpenSSL.
diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat
index 662bfcfa9a3..c655f6ffda3 100644
--- a/PCbuild/get_externals.bat
+++ b/PCbuild/get_externals.bat
@@ -2,7 +2,8 @@
setlocal
rem Simple script to fetch source for external libraries
-pushd "%~dp0..\.."
+if not exist "%~dp0..\externals" mkdir "%~dp0..\externals"
+pushd "%~dp0..\externals"
if "%SVNROOT%"=="" set SVNROOT=http://svn.python.org/projects/external/
diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props
index c7087cc4e0c..93d69d03a24 100644
--- a/PCbuild/pyproject.props
+++ b/PCbuild/pyproject.props
@@ -16,7 +16,7 @@
python35$(PyDebugExt)
$(OutDir)python$(PyDebugExt).exe
$(OutDir)kill_python$(PyDebugExt).exe
- ..\..
+ ..\externals
$(externalsDir)\sqlite-3.8.3.1
$(externalsDir)\bzip2-1.0.6
$(externalsDir)\xz-5.0.5
diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt
index 535ea00a514..91ef8d17fd5 100644
--- a/PCbuild/readme.txt
+++ b/PCbuild/readme.txt
@@ -278,7 +278,7 @@ painless as possible, called "get_externals.bat" and located in this
directory. This script extracts all the external sub-projects from
http://svn.python.org/projects/external
via Subversion (so you'll need svn.exe on your PATH) and places them
-in ..\.. (relative to this directory).
+in ..\externals (relative to this directory).
It is also possible to download sources from each project's homepage,
though you may have to change folder names or pass the names to MSBuild
diff --git a/Tools/buildbot/test-amd64.bat b/Tools/buildbot/test-amd64.bat
index 2441e01f247..7a241f50ab9 100644
--- a/Tools/buildbot/test-amd64.bat
+++ b/Tools/buildbot/test-amd64.bat
@@ -2,6 +2,6 @@
setlocal
rem The following line should be removed before #20035 is closed
-set TCL_LIBRARY=%~dp0..\..\..\tcltk64\lib\tcl8.6
+set TCL_LIBRARY=%~dp0..\..\externals\tcltk64\lib\tcl8.6
call "%~dp0..\..\PCbuild\rt.bat" -d -q -x64 -uall -rwW -n --timeout=3600 %*
diff --git a/Tools/buildbot/test.bat b/Tools/buildbot/test.bat
index 1fa0ad94dbe..6a6448c3ae8 100644
--- a/Tools/buildbot/test.bat
+++ b/Tools/buildbot/test.bat
@@ -2,6 +2,6 @@
setlocal
rem The following line should be removed before #20035 is closed
-set TCL_LIBRARY=%~dp0..\..\..\tcltk\lib\tcl8.6
+set TCL_LIBRARY=%~dp0..\..\externals\tcltk\lib\tcl8.6
call "%~dp0..\..\PCbuild\rt.bat" -d -q -uall -rwW -n --timeout=3600 %*