pip icon indicating copy to clipboard operation
pip copied to clipboard

Error when %TEMP% is a junction to a dir on a letter-less drive

Open grv87 opened this issue 4 years ago • 6 comments

Description

Error when %TEMP% is a junction to a dir on a letter-less drive.

The error looks similar to jazzband/pip-tools#1061, but in pip itself.

Expected behavior

Successful install/reinstall

pip version

21.3

Python version

3.10.0, 3.9.6, 3.8.2

OS

Windows 10 x64

How to Reproduce

  1. Create a volume and don't assign a letter to it
  2. Create dir on this volume
  3. Create a junction on this dir: ln--junction junction ‪\\?\Volume{<new volume uuid>}\dir
  4. set TEMP=%cd%\junction
  5. Install some package: pip3 install CrossMap

Output

Traceback (most recent call last):
  File "<python_install_dir>\lib\site-packages\pip\_internal\cli\base_command.py", line 164, in exc_logging_wrapper
    status = run_func(*args)
  File "<python_install_dir>\lib\site-packages\pip\_internal\cli\req_command.py", line 204, in wrapper
    return func(self, options, args)
  File "<python_install_dir>\lib\site-packages\pip\_internal\commands\install.py", line 294, in run
    wheel_cache = WheelCache(options.cache_dir, options.format_control)
  File "<python_install_dir>\lib\site-packages\pip\_internal\cache.py", line 219, in __init__
    self._ephem_cache = EphemWheelCache(format_control)
  File "<python_install_dir>\lib\site-packages\pip\_internal\cache.py", line 196, in __init__
    super().__init__(self._temp_dir.path, format_control)
  File "<python_install_dir>\lib\site-packages\pip\_internal\cache.py", line 121, in __init__
    super().__init__(cache_dir, format_control, {"binary"})
  File "<python_install_dir>\lib\site-packages\pip\_internal\cache.py", line 44, in __init__
    assert not cache_dir or os.path.isabs(cache_dir)
AssertionError

Code of Conduct

grv87 avatar Oct 18 '21 11:10 grv87

What would the value of cache_dir be in this case? I wonder if this is can be simply fixed by switching to pathlib (which handles UNC paths better than os.path). Also, I wonder if the directory junction is actually relevant here; what happens if TEMP is set directly to the network drive?

uranusjr avatar Oct 18 '21 14:10 uranusjr

cache_dir: Volume{<new volume uuid>}\dir\pip-ephem-wheel-cache-...

Note that \\?\ prefix is lost.

TEMP set to network UNC path works. But my TEMP dir is not on a network drive. Junctions can't target network drives.

grv87 avatar Oct 21 '21 13:10 grv87

Following the chain of calls leads to os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-")). Can you confirm what that call returns in your environment? (Clearly you can just use any old prefix for the call).

If it doesn't return a valid path, that would imply a Python bug (which we might be able to work around, but I'd also like to make sure the root issue is reported if that's what it is).

pfmoore avatar Oct 21 '21 13:10 pfmoore

os.path.realpath returns Volume{uuid}\\dir\\pip-kind-.... Yes, the prefix is lost.

I've reported https://bugs.python.org/issue45597.

grv87 avatar Oct 24 '21 09:10 grv87

Does pathlib.Path.resolve() have the same issue? If not, we can just use that instead.

uranusjr avatar Oct 25 '21 06:10 uranusjr

@uranusjr, yes, it has the same issue too.

If I'm the single user affected then I'm ready to wait for the fix in Python. I don't use pip very often, and there is the obvious workaround (set TEMP to local dir before a run). Feel free to close this issue.

grv87 avatar Nov 04 '21 09:11 grv87