Skip to content

[BUG] Import fails if pip is imported before #5046

Closed
@johannesloibl

Description

@johannesloibl

setuptools version

pip==25.1.1, setuptools==80.9.0

Python version

3.10, 3.11

OS

Windows

Additional environment information

This only happens for Python 3.10 and 3.11, not for 3.9 and 3.12.

Description

Apparently if pip is imported before setuptools, the import of setuptools fails:

PS C:\temp> uv venv .venv_setuptools --python 3.11
Using CPython 3.11.10
Creating virtual environment at: .venv_setuptools
Activate with: .venv_setuptools\Scripts\activate
PS C:\temp> .\.venv_setuptools\Scripts\activate.ps1

(.venv_setuptools) PS C:\temp> uv pip install pip setuptools
Using Python 3.11.10 environment at: .venv_setuptools
Resolved 2 packages in 226ms
Installed 2 packages in 244ms
 + pip==25.1.1
 + setuptools==80.9.0

(.venv_setuptools) PS C:\temp> python -c "import pip;import setuptools"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\temp\.venv_setuptools\Lib\site-packages\setuptools\__init__.py", line 21, in <module>
    import _distutils_hack.override  # noqa: F401
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\temp\.venv_setuptools\Lib\site-packages\_distutils_hack\override.py", line 1, in <module>
    __import__('_distutils_hack').do_override()
  File "C:\temp\.venv_setuptools\Lib\site-packages\_distutils_hack\__init__.py", line 89, in do_override
    ensure_local_distutils()
  File "C:\temp\.venv_setuptools\Lib\site-packages\_distutils_hack\__init__.py", line 76, in ensure_local_distutils
    assert '_distutils' in core.__file__, core.__file__
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: C:\Users\...\AppData\Roaming\uv\data\python\cpython-3.11.10-windows-x86_64-none\Lib\distutils\core.py

This is even a bigger issue for everyone using the pip-system-certs package (that uses pip as dependency), since it is adding an import hook via a pth file.
That means each interpreter session will automatically have pip imported.

That main reason why it fails is _distutils_hack.DistutilsMetaFinder.spec_for_pip, which sets method spec_for_distutils to lambda: None, so once setuptools is imported the method _distutils_hack.DistutilsMetaFinder.spec_for_distutils is not called anymore, since it got overwritten before.

Expected behavior

import pip
import setuptools

should be working without error.

How to Reproduce

  1. Create an empty venv
  2. Activate venv
  3. Install pip and setuptools
    1. Call python -c "import pip;import setuptools"

Output

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\temp\.venv_setuptools\Lib\site-packages\setuptools\__init__.py", line 21, in <module>
    import _distutils_hack.override  # noqa: F401
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\temp\.venv_setuptools\Lib\site-packages\_distutils_hack\override.py", line 1, in <module>
    __import__('_distutils_hack').do_override()
  File "C:\temp\.venv_setuptools\Lib\site-packages\_distutils_hack\__init__.py", line 89, in do_override
    ensure_local_distutils()
  File "C:\temp\.venv_setuptools\Lib\site-packages\_distutils_hack\__init__.py", line 76, in ensure_local_distutils
    assert '_distutils' in core.__file__, core.__file__
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: C:\Users\...\AppData\Roaming\uv\data\python\cpython-3.11.10-windows-x86_64-none\Lib\distutils\core.py

Metadata

Metadata

Assignees

No one assigned

    Labels

    Needs TriageIssues that need to be evaluated for severity and status.bug

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions