--source: the tmpbin python -> python2 link breaks in several setups
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 42/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Attiva
- Ambito
- build-system
Direzione di ricerca
The bug is in build_node_from_src in nodeenv.py, which looks up python2 and links it as tmpbin/python. Start by running the issue's reproduction script against that function, once per case, to see each failure. Done means the five cases (python2.7 only, dangling link, stale link, pyenv-style shim, relative PATH entry) either build or fail with a clear message, and the fix settles whether the link approach should change.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
On Python 3, build_node_from_src looks up python2 and points python at it through a link in tmpbin (master, ecb4b74):
python2_path = shutil.which('python2')
if not python2_path:
raise OSError(
'Python >=3.0 virtualenv detected, but no python2 '
'command (required for building node.js) was found'
)
logger.debug(' * Temporarily pointing python to %s', python2_path)
node_tmpbin_dir = join(src_dir, 'tmpbin')
node_tmpbin_link = join(node_tmpbin_dir, 'python')
mkdir(node_tmpbin_dir)
if not os.path.exists(node_tmpbin_link):
callit(['ln', '-s', python2_path, node_tmpbin_link])
env['PATH'] = '{}:{}'.format(node_tmpbin_dir,
os.environ.get('PATH', ''))
PR #429 keeps this code for node.js before 13 (the lookup) and before 8.8 (the link). It breaks in these cases:
- Only
python2.7is on PATH. A Python 2.7 installed withmake altinstallhaspython2.7but nopython2. nodeenv raises the "no python2 command" error, although node's own./configurewrapper (6.12+ / 8.5+) triespython2.7first. - A dangling
tmpbin/pythonfrom an earlier run.srcis kept after a failed build or with--no-clean-src, and--forcereuses it.os.path.existsfollows the link, so once the old python2 is gone,ln -sfails withFile exists. - A stale
tmpbin/pythonfrom an earlier run. If the old target still exists, the build uses it instead of the python2 found now. - python2 is a pyenv shim. pyenv shims pick the program by their own name (
program="${0##*/}", thenpyenv exec "$program"), so a link namedpythonto~/.pyenv/shims/python2runspyenv exec python. With e.g.pyenv global 3.12.0 2.7.18that is Python 3.12. - A relative PATH entry.
shutil.whichreturns a relative path (bin/python2), andln -sstores it relative totmpbin/, so the link dangles and./configurecan't findpython.
The link is also made by running ln -s through callit, while the rest of the module uses os.symlink.
Reproduce
On master (ecb4b74) on macOS, where /usr/bin has no python2, with fake scripts in place of node's configure, make and python2. Run from a nodeenv checkout:
T=/tmp/y; mkdir -p $T
git show ecb4b74:nodeenv.py > $T/nodeenv.py
PY=$(command -v python3)
mkscript() { mkdir -p "$(dirname "$1")"; printf '#!/bin/sh\n%s\n' "$2" > "$1"; chmod +x "$1"; }
mkscript $T/tools/make 'exit 0'
mkscript $T/py27/python2.7 'echo "python2.7 runs"'
mkscript $T/py2old/python2 'echo "OLD python2 runs"'
mkscript $T/py2new/python2 'echo "NEW python2 runs"'
mkscript $T/shims/python2 'echo "shim dispatches to: ${0##*/}"'
# every case gets a node source dir whose configure runs `python`
newcase() { mkscript $T/$1/src/node-src/configure 'exec python'; }
cat > $T/run.py <<'EOF'
import sys, types
sys.path.insert(0, '/tmp/y')
import nodeenv
work = sys.argv[1]
args = types.SimpleNamespace(load_average=None, jobs='2', without_ssl=False,
debug=False, profile=False, make_path='/tmp/y/tools/make', verbose=True)
try:
nodeenv.build_node_from_src(work + '/env', work + '/src', work + '/src/node-src', args)
except OSError as e:
print('OSError:', e)
EOF
- Only
python2.7:
newcase c1
env PATH="$T/py27:/usr/bin:/bin" $PY $T/run.py $T/c1
OSError: Python >=3.0 virtualenv detected, but no python2 command (required for building node.js) was found
- Dangling link:
newcase c2; mkdir -p $T/c2/src/tmpbin; ln -s $T/gone/python2 $T/c2/src/tmpbin/python
env PATH="$T/py2new:/usr/bin:/bin" $PY $T/run.py $T/c2
ln: /tmp/y/c2/src/tmpbin/python: File exists
OSError: Command ln -s /tmp/y/py2new/python2 /tmp/y/c2/src/tmpbin/python failed with error code 1
- Stale link:
newcase c3; mkdir -p $T/c3/src/tmpbin; ln -s $T/py2old/python2 $T/c3/src/tmpbin/python
env PATH="$T/py2new:/usr/bin:/bin" $PY $T/run.py $T/c3
OLD python2 runs
- A shim that dispatches on its name like pyenv's:
newcase c4
env PATH="$T/shims:/usr/bin:/bin" $PY $T/run.py $T/c4
shim dispatches to: python
- Relative PATH entry:
newcase c5; mkscript $T/c5/bin/python2 'echo "python2 runs"'
(cd $T/c5 && env PATH="bin:/usr/bin:/bin" $PY $T/run.py $T/c5)
readlink $T/c5/src/tmpbin/python
./configure: line 2: exec: python: not found
OSError: Command ./configure --prefix=/tmp/y/c5/env failed with error code 127
bin/python2
- Lingua principale
- Python
- Stelle
- 1.8k
- Fork
- 225
- Merge medio
- 17h 18m
- PR unite (30g)
- 26
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di ekalinin/nodeenv
-
README config example breaks when copied into ~/.nodeenvrcForse già presa @jihtsan l’ha presa 9 giorni fa. Apertadocs
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
I maintainer di solito rispondono entro 1 giorno
-
activate.fish erases a pre-existing NODE_PATH and never restores itForse già presa @jihtsan l’ha presa 9 giorni fa. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 50/100
I maintainer di solito rispondono entro 1 giorno
-
--source passes --make, --jobs and --load-average to the shell unquotedForse già presa @jihtsan l’ha presa 9 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 35/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
ekalinin/nodeenv#416 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di ekalinin/nodeenv
Issue simili
-
comp/tools P2 type/bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
NousResearch/hermes-agent#142908 · 1 commento ·
-
[oblt-aw][autodoc] Fix malformed headings in new Buildkite docs pagesForse già presa @github-actions l’ha presa oggi. Apertadocumentation
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 83/100
I maintainer di solito rispondono entro 1 giorno
-
[Bug]: fileUploadMatrix.test.ts URL case does a real DNS lookup and fails offlineForse già presa @r2jaff l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
ComposioHQ/composio#5054 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
pytorch/tensordict#3286 ·
I maintainer di solito rispondono entro 1 giorno