Sono su MacOSX usando bash
come shell. Ho un collegamento simbolico, creato in questo modo:
ln -s /usr/bin/python python2
Ho un pacchetto che usa python2 e voglio creare un collegamento simbolico nella mia directory di lavoro corrente a /usr/bin/python
cui in realtà è python2. Quando faccio un python2
dalla riga di comando ottengo questo errore:
python2: realpath couldn't resolve "/usr/bin/python2"
Ma invocarlo in questo modo ./python2
risolve il percorso correttamente. Il mio PATH
ha .
dentro. In effetti l'ho modificato, a scopo di test, per includerlo solo .
in esso.
Come lo risolvo? Grazie!
Contesto
Alcune delle soluzioni suggerite di seguito non funzioneranno per me. Ho cercato di distillare la mia domanda nel modo più mirato e breve possibile in modo che le persone non affogassero in un mare di testo, ma chiaramente ho bisogno di fornire più informazioni.
Sto cercando di sviluppare su un pacchetto che ho clonato da Git. Il pacchetto originale git-multimail
, è / è stato sviluppato su alcune varianti di Linux (suppongo Ubuntu). Ho provato a modificarlo per poterlo utilizzare e la sua suite di test su MacOSX con il minor numero di modifiche possibile. Ecco perché alcune delle soluzioni proposte non sono l'ideale:
Come root, crea un
python2
link simbolico in / usr / bin /. Sto cercando una soluzione che non richiederebbe questo. Questa era un'opzione ovvia all'inizio, ma vorrei una soluzione che modifica il sistema host il meno possibile. Questo è il motivo per cui volevo creare un collegamento simbolico temporaneo nella directory di lavoro corrente, aggiungere il CWD (ovvero.
) al mio percorso e quindi distruggerlo al termine (ovvero il collegamento simbolico).Crea uno script wrapper per chiamare lo script Python con il Python esistente. Il problema è che gran parte della suite di test utilizza gli script_file effettivi come file eseguibili, a seconda di shebang per trovare l'ambiente di esecuzione corretto. Ciò significherebbe modificare considerevolmente la suite di test. In questo contesto, (vedi sotto per uno snippet del framework di test), dovrei aggiungere un wrapper per ogni
.py
file; inoltre l'utente / sviluppatore dovrebbe essere a conoscenza delle diverse regole per l'utilizzo del pacchetto in base al sistema su cui si trovano (ovvero su MacOSX assicurarsi di non utilizzare i file Python senza invocarli tramite il wrapper o chiamare esplicitamente/usr/bin/python file.py
).#! /bin/sh D=$(cd $(dirname "$0") && pwd) MULTIMAIL="$D/../git-multimail/git_multimail.py" POST_RECEIVE="$D/../git-multimail/post-receive" TESTREPO=$("$D/create-test-repo") HOME="$D" XDG_CONFIG_HOME="$D" GIT_CONFIG_NOSYSTEM=1 export HOME XDG_CONFIG_HOME GIT_CONFIG_NOSYSTEM cd $TESTREPO test_email() { REFNAME="$1" OLDREV="$2" NEWREV="$3" echo "$OLDREV" "$NEWREV" "$REFNAME" | USER=pushuser "$MULTIMAIL" }
Modifica di tutti i
python2
riferimenti inpython
. Il README lo suggerisce, ma ciò rende effettivamente inutile il controllo della versione poiché il sistema vede il cambiamento come nuova versione, quando in realtà non lo è (semanticamente).
Sto usando (3) ma sto cercando di trovare una soluzione migliore. Sono disposto ad accettare che le cose vanno esattamente così (cioè non esiste un modo adatto per indicare 'python2' /usr/bin/python
che sia portatile e discreto senza molte modifiche alla suite di test e al framework reale).
git-multimail.py
lo è #!/usr/bin/env python2
, quindi c'è un modo (relativamente) semplice per farlo.
ln -s /usr/bin/python2.7 /usr/local/bin/python2
ha funzionato
ln -s /usr/bin/python /usr/bin/python2