]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-32409: Fix regression in activate.bat on international Windows (GH-10295)
authorsamstagern <30337691+samstagern@users.noreply.github.com>
Wed, 7 Nov 2018 16:49:14 +0000 (17:49 +0100)
committerVinay Sajip <vinay_sajip@yahoo.co.uk>
Wed, 7 Nov 2018 16:49:14 +0000 (16:49 +0000)
Handle Unicode contents on localised Windows systems when activating a
venv. activate.bat currently breaks on German Windows systems, as chcp.com does
not return a plain number as on English systems, but (arbitrarily) appends a dot at the end
(for example "Aktive Codepage: 850." instead of "Active Codepage: 850"). The
dependency to chcp.com is removed and ctypes is used to get, set and restore the
console output code page. The code page for console input is not changed.

We can't use __VENV_PYTHON__ to find python.exe, since it's UTF-8. cmd.exe decodes
the script using the console output code page.

Lib/venv/scripts/nt/activate.bat
Misc/NEWS.d/next/Library/2018-11-02-12-01-00.bpo-32409.MFRX2Q.rst [new file with mode: 0644]

index 126049f495fe3bd5ba9f97faf2c947a7fe23668e..2c81a28ce938545769cc4cf2c03950e80c08d1b7 100644 (file)
@@ -1,11 +1,10 @@
 @echo off
 
-rem This file is UTF-8 encoded, so we need to update the current code page while executing it
-for /f "tokens=2 delims=:" %%a in ('"%SystemRoot%\System32\chcp.com"') do (
-    set "_OLD_CODEPAGE=%%a"
-)
+rem This file is UTF-8 encoded, so we need to update the current code page while executing it.
+for /f %%a in ('%~dp0python.exe -Ic "import ctypes; print(ctypes.windll.kernel32.GetConsoleOutputCP())"') do (set "_OLD_CODEPAGE=%%a")
+
 if defined _OLD_CODEPAGE (
-    "%SystemRoot%\System32\chcp.com" 65001 > nul
+    %~dp0python.exe -Ic "import ctypes; ctypes.windll.kernel32.SetConsoleOutputCP(65001)"
 )
 
 set "VIRTUAL_ENV=__VENV_DIR__"
@@ -40,6 +39,6 @@ set "PATH=%VIRTUAL_ENV%\__VENV_BIN_NAME__;%PATH%"
 
 :END
 if defined _OLD_CODEPAGE (
-    "%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul
+    %~dp0python.exe -Ic "import ctypes; ctypes.windll.kernel32.SetConsoleOutputCP(%_OLD_CODEPAGE%)"
     set "_OLD_CODEPAGE="
 )
diff --git a/Misc/NEWS.d/next/Library/2018-11-02-12-01-00.bpo-32409.MFRX2Q.rst b/Misc/NEWS.d/next/Library/2018-11-02-12-01-00.bpo-32409.MFRX2Q.rst
new file mode 100644 (file)
index 0000000..9b57c5b
--- /dev/null
@@ -0,0 +1,2 @@
+Fixed implementation of :file:`activate.bat` to handle Unicode contents on
+localized Windows systems (eg. German). Patch by Martin Bijl.
\ No newline at end of file