Files
MINGW-packages/mingw-w64-python/2052-venv-creation-fixes.patch
Christoph Reiter 7ab734e8fd python: copy all python launchers into the venv
Turns out Python uses the basename of the calling executable to
decide which launcher in the venv it uses to call pip with.
This means we have to copy all launchers we ship.

Use the non versioned launchers as src so the rewrite logic in venv
copies the venvlauncher variants.

Fixes #7227
2020-11-03 21:18:00 +01:00

63 lines
2.8 KiB
Diff

Don't copy the whole /bin when symlinking.
Also provide python3.exe for backwards compat.
Unset MSYSTEM, to fix some path comparisons due to os.sep differences.
Skip some msvc build specifics
diff -Naur Python-3.8.0-orig/Lib/venv/__init__.py Python-3.8.0/Lib/venv/__init__.py
--- Python-3.8.0-orig/Lib/venv/__init__.py 2019-10-22 10:05:21.691201800 +0300
+++ Python-3.8.0/Lib/venv/__init__.py 2019-10-22 10:05:25.591208600 +0300
@@ -11,6 +11,7 @@
import sys
import sysconfig
import types
+from sysconfig import _POSIX_BUILD
logger = logging.getLogger(__name__)
@@ -110,7 +111,7 @@
context.executable = executable
context.python_dir = dirname
context.python_exe = exename
- if sys.platform == 'win32':
+ if sys.platform == 'win32' and not _POSIX_BUILD:
binname = 'Scripts'
incpath = 'Include'
libpath = os.path.join(env_dir, 'Lib', 'site-packages')
@@ -244,7 +244,7 @@
if not os.path.islink(path):
os.chmod(path, 0o755)
else:
- if self.symlinks:
+ if self.symlinks and not _POSIX_BUILD:
# For symlinking, we need a complete copy of the root directory
# If symlinks fail, you'll get unnecessary copies of files, but
# we assume that if you've opted into symlinks on Windows then
@@ -266,7 +267,13 @@
if os.path.lexists(src):
copier(src, os.path.join(binpath, suffix))
- if sysconfig.is_python_build(True):
+ if _POSIX_BUILD:
+ # copy from python/pythonw so the venvlauncher magic in symlink_or_copy triggers
+ copier(os.path.join(dirname, 'python.exe'), os.path.join(binpath, 'python3.exe'))
+ copier(os.path.join(dirname, 'python.exe'), os.path.join(binpath, 'python%d.%d.exe' % sys.version_info[:2]))
+ copier(os.path.join(dirname, 'pythonw.exe'), os.path.join(binpath, 'python3w.exe'))
+
+ if sysconfig.is_python_build(True) and not _POSIX_BUILD:
# copy init.tcl
for root, dirs, files in os.walk(context.python_dir):
if 'init.tcl' in files:
@@ -285,9 +285,11 @@
# We run ensurepip in isolated mode to avoid side effects from
# environment vars, the current directory and anything else
# intended for the global Python environment
+ env = os.environ.copy()
+ env.pop("MSYSTEM", None)
cmd = [context.env_exe, '-Im', 'ensurepip', '--upgrade',
- '--default-pip']
- subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+ '--default-pip']
+ subprocess.check_call(cmd, stderr=subprocess.STDOUT, env=env)
def setup_scripts(self, context):
"""