Skip to content

Commit

Permalink
Preload script wrappers at import time (#215)
Browse files Browse the repository at this point in the history
  • Loading branch information
pfmoore authored May 3, 2024
1 parent de9b5a6 commit 888c48b
Showing 1 changed file with 23 additions and 7 deletions.
30 changes: 23 additions & 7 deletions distlib/scripts.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,25 @@
sys.exit(%(func)s())
'''

# Pre-fetch the contents of all executable wrapper stubs.
# This is to address https://github.com/pypa/pip/issues/12666.
# When updating pip, we rename the old pip in place before installing the
# new version. If we try to fetch a wrapper *after* that rename, the finder
# machinery will be confused as the package is no longer available at the
# location where it was imported from. So we load everything into memory in
# advance.

if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'):
# Issue 31: don't hardcode an absolute package name, but
# determine it relative to the current package
DISTLIB_PACKAGE = __name__.rsplit('.', 1)[0]

WRAPPERS = {
r.name: r.bytes
for r in finder(DISTLIB_PACKAGE).iterator("")
if r.name.endswith(".exe")
}


def enquote_executable(executable):
if ' ' in executable:
Expand Down Expand Up @@ -386,14 +405,11 @@ def _get_launcher(self, kind):
bits = '32'
platform_suffix = '-arm' if get_platform() == 'win-arm64' else ''
name = '%s%s%s.exe' % (kind, bits, platform_suffix)
# Issue 31: don't hardcode an absolute package name, but
# determine it relative to the current package
distlib_package = __name__.rsplit('.', 1)[0]
resource = finder(distlib_package).find(name)
if not resource:
msg = ('Unable to find resource %s in package %s' % (name, distlib_package))
if name not in WRAPPERS:
msg = ('Unable to find resource %s in package %s' %
(name, DISTLIB_PACKAGE))
raise ValueError(msg)
return resource.bytes
return WRAPPERS[name]

# Public API follows

Expand Down

0 comments on commit 888c48b

Please sign in to comment.