pex icon indicating copy to clipboard operation
pex copied to clipboard

Pex external venv should copy wheel files

Open zmanji opened this issue 1 year ago • 0 comments

Peeled out of https://github.com/pantsbuild/pex/issues/2312#issuecomment-1871722718

Thinking about it an external venv should copy files from the wheel cache instead of hardlinks / symlinks.

In my case I use pex to create venvs for tools like VSCode. I could choose to edit a file in a venv for debugging purposes and if I do, I inadvertently corrupt the wheel cache.

Example:

PEX_SCRIPT='pex3' pex venv create -vv --copies --force -d ./tenv  --no-build 'cowsay==6.1'

Then remove the first line (import re) of

./tenv/lib/python3.10/site-packages/cowsay/main.py

Then the venv is broken when I run:

./tenv/bin/cowsay -t 'test'
Traceback (most recent call last):
  File "/home/zmanji/tmp/./tenv/bin/cowsay", line 14, in <module>
    sys.exit(entry_point())
  File "/home/zmanji/tmp/tenv/lib/python3.10/site-packages/cowsay/__main__.py", line 28, in cli
    char_funcs[args.character](args.text)
  File "/home/zmanji/tmp/tenv/lib/python3.10/site-packages/cowsay/__init__.py", line 24, in func
    draw(str(text), char_lines)
  File "/home/zmanji/tmp/tenv/lib/python3.10/site-packages/cowsay/main.py", line 54, in draw
    if len(re.sub(r'\s', '', text)) == 0:
NameError: name 're' is not defined

Even if I delete the venv and recreate it it still suffers from the same problem

rm -rf ./tenv 
PEX_SCRIPT='pex3' pex venv create -vv --copies --force -d ./tenv  --no-build 'cowsay==6.1'
./tenv/bin/cowsay -t 'test'  
Traceback (most recent call last):
  File "/home/zmanji/tmp/./tenv/bin/cowsay", line 14, in <module>
    sys.exit(entry_point())
  File "/home/zmanji/tmp/tenv/lib/python3.10/site-packages/cowsay/__main__.py", line 28, in cli
    char_funcs[args.character](args.text)
  File "/home/zmanji/tmp/tenv/lib/python3.10/site-packages/cowsay/__init__.py", line 24, in func
    draw(str(text), char_lines)
  File "/home/zmanji/tmp/tenv/lib/python3.10/site-packages/cowsay/main.py", line 54, in draw
    if len(re.sub(r'\s', '', text)) == 0:
NameError: name 're' is not defined

The only way to fix this is to delete the pex wheel cache.

A way to fix this is to overload the existing --copies flag to also copy files from the wheel cache or to introduce another flag to signal this and change this function https://github.com/pantsbuild/pex/blob/4eb5c9aa25c6a695bf55263ab239189b720cebaf/pex/pep_376.py#L350-L404

to do copies instead of links.

zmanji avatar Dec 29 '23 12:12 zmanji