mirror of
https://github.com/astral-sh/uv.git
synced 2025-08-30 23:37:24 +00:00
![]() ## Summary If you have a file `typing.py` in the current working directory, `python -m` doesn't work in some Python versions: ```sh ❯ python -m foo Could not import runpy module Traceback (most recent call last): File "/Users/crmarsh/.local/share/rtx/installs/python/3.9.18/lib/python3.9/runpy.py", line 15, in <module> import importlib.util File "/Users/crmarsh/.local/share/rtx/installs/python/3.9.18/lib/python3.9/importlib/util.py", line 2, in <module> from . import abc File "/Users/crmarsh/.local/share/rtx/installs/python/3.9.18/lib/python3.9/importlib/abc.py", line 17, in <module> from typing import Protocol, runtime_checkable ImportError: cannot import name 'Protocol' from 'typing' (/Users/crmarsh/workspace/uv/typing.py) ``` This did _not_ cause problems for us on Python 3.11 or later, because we set `PYTHONSAFEPATH`, which avoids adding the current working directory to `sys.path`. However, on earlier versions, we _were_ failing with the above. (It's important that we run interpreter discovery in the current working directory, since doing otherwise breaks pyenv shims.) The fix implemented here uses `-I` to run Python in isolated mode, which is even stricter. The downside of isolated mode is that we currently rely on setting `PYTHONPATH` to find the "fake module" that we create on disk, and `-I` means `PYTHONPATH` is totally ignored. So, instead, we run a script directly, and that _script_ injects the path we care about into `PYTHONSAFEPATH`. Closes https://github.com/astral-sh/uv/issues/2547. |
||
---|---|---|
.. | ||
packaging | ||
__init__.py | ||
get_interpreter_info.py |