Skip to content

gh-146310: Fix ensurepip to treat empty WHEEL_PKG_DIR as unset#146357

Open
kimimgo wants to merge 2 commits intopython:mainfrom
kimimgo:fix/ensurepip-empty-wheel-pkg-dir-146310
Open

gh-146310: Fix ensurepip to treat empty WHEEL_PKG_DIR as unset#146357
kimimgo wants to merge 2 commits intopython:mainfrom
kimimgo:fix/ensurepip-empty-wheel-pkg-dir-146310

Conversation

@kimimgo
Copy link

@kimimgo kimimgo commented Mar 24, 2026

Fixes #146310

Path('') resolves to the current working directory (PosixPath('.')), so when WHEEL_PKG_DIR is an empty string (not None), ensurepip searches CWD for wheel files. This can cause unexpected behavior or crashes if CWD contains files matching pip-*.whl.

Changes

  • Lib/ensurepip/__init__.py: Add truthiness check so empty strings are treated the same as None
  • Lib/test/test_ensurepip.py: Add test verifying empty WHEEL_PKG_DIR does not search CWD

Before/After

# Before: Path('').resolve() -> PosixPath('/current/working/dir')
# Empty string was treated as a valid directory path

# After: Empty string treated as None -> use bundled wheel

Path('') resolves to CWD, so an empty WHEEL_PKG_DIR string caused
ensurepip to search the current working directory for wheel files.
Add a truthiness check to treat empty strings the same as None.
# installs wheel packages in the /usr/share/python-wheels/ directory and don't
# install the ensurepip._bundled package.
if (_pkg_dir := sysconfig.get_config_var('WHEEL_PKG_DIR')) is not None:
if (_pkg_dir := sysconfig.get_config_var('WHEEL_PKG_DIR')) is not None and _pkg_dir:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You may write it as:

Suggested change
if (_pkg_dir := sysconfig.get_config_var('WHEEL_PKG_DIR')) is not None and _pkg_dir:
_pkg_dir = sysconfig.get_config_var('WHEEL_PKG_DIR')
if _pkg_dir:

# An empty WHEEL_PKG_DIR converts to Path('.') which would
# incorrectly search the current working directory.
with unittest.mock.patch.object(ensurepip, '_WHEEL_PKG_DIR', None):
self.assertIsNone(ensurepip._find_wheel_pkg_dir_pip())
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test is not directly related to the fix. I suggest a different test:

    def test_wheel_pkg_dir_none(self):
        for value in ('', None):
            with unittest.mock.patch('sysconfig.get_config_var',
                                     return_value=value) as get_config_var:
                module = import_helper.import_fresh_module('ensurepip')
                self.assertIsNone(module._WHEEL_PKG_DIR)
                get_config_var.assert_called_once_with('WHEEL_PKG_DIR')

with from test.support import import_helper at top level.

@@ -0,0 +1,2 @@
Fix :mod:`ensurepip` to treat an empty string ``WHEEL_PKG_DIR`` as unset,
preventing it from searching the current working directory for wheel files.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This NEWS entry sounds too technical. I suggest to describe instead the old behavior:

The :mod:`ensurepip` module no longer looks for `pip-*.whl` wheel packages in the current directory.

Per @vstinner:
- Simplify to 'if _pkg_dir:' instead of walrus + is not None
- Replace mock-based test with import_fresh_module for both '' and None
- Reword NEWS to describe old behavior instead of fix
@kimimgo
Copy link
Author

kimimgo commented Mar 24, 2026

Thanks @vstinner! Updated all three points:

  • Simplified to if _pkg_dir:
  • Replaced test with import_fresh_module covering both '' and None
  • Reworded NEWS entry

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ensurepip looks for wheels in CWD when WHEEL_PKG_DIR is an empty string

2 participants