2011-10-12 8 views
11

Qualcuno può spiegare come Python 2.6 potrebbe essere eseguito automaticamente sul mio computer? Sembra che python punti a 2,7, quindi sembra che which non mi sta dando informazioni corrette.In bash, "quale" fornisce un percorso errato - versioni Python

~> python --version 
Python 2.6.5 
~> which python 
/opt/local/bin/python 
~> /opt/local/bin/python --version 
Python 2.7.2 
~> ls -l /opt/local/bin/python 
lrwxr-xr-x 1 root admin 24 12 Oct 16:02 /opt/local/bin/python -> /opt/local/bin/python2.7 

Quando si genera un errore, vedo cosa sta veramente facendo funzionare. Perché potrebbe essere?

~> python -error-making-argument 
Unknown option: -e 
usage:  /Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python [option] ... [-c cmd | -m mod | file | -] [arg] ... 
Try `python -h' for more information. 

E come posso correggerlo?

---- Edit: ----

Da suggerimenti nei commenti:

~> alias 
alias cp='cp -i' 
alias gcc='gcc -Wall' 
~> type python 
python is /opt/local/bin/python 
+3

L'alias di Python è nella versione 2.6.5? – GreenMatt

+0

digita 'alias' al prompt per scoprirlo. – aioobe

+2

Prova 'type python' invece di' which python'. Ti mostrerà la cosa reale che verrà eseguita, inclusi gli alias e le funzioni della shell, mentre 'which' no. –

risposta

20

Bash utilizza uno internal hash table per ottimizzare le ricerche $PATH. Quando si installa un nuovo programma con lo stesso nome di un programma esistente (python in questo caso) in precedenza nel proprio $PATH, Bash non lo sa e continua a utilizzare quello vecchio. L'eseguibile which esegue una ricerca completa $PATH e stampa il risultato desiderato.

Per risolvere questo problema, eseguire il comando hash -d python. Questo cancellerà python dalla tabella hash di Bash e lo forza a fare una ricerca completa $PATH la prossima volta che la invochi. In alternativa, è anche possibile eseguire hash -r per cancellare completamente la tabella hash.

Il type builtin ti dirà come verrà interpretato un dato comando. Se dice che un comando è hash, significa che Bash salterà la ricerca $PATH per l'eseguibile.

+0

Sembra un errore che si modifica nella variabile '$ PATH' non cancella automaticamente la tabella hash. –

+0

Sulla mia versione di Bash (3.2.25 su Linux), lo fa. –

+0

Ottimo! Grazie per l'intuizione! =) –

0

Ho appena controllato il mio .bash_profile, e conteneva il seguente:

# Setting PATH for MacPython 2.6 
# The orginal version is saved in .bash_profile.pysave 
PATH="/Library/Frameworks/Python.framework/Versions/2.6/bin:/usr/local/git/bin:${PATH}" 
export PATH 

Commentando questo ha risolto il mio problema.

Se qualcuno può dirmi perché which e type ha ancora dato risposte errate, sarei molto grato e darò loro un segno di spunta!

Grazie per tutte le vostre indicazioni!

+0

Senza rimuoverlo dal tuo PATH, quali sono i risultati di' which --all python' (o il Equivalente OS X)? Di 'ls -l/opt/local/bin/python2.7'? Di 'file/opt/local/bin/python2.7'? Di 'python -v' (minuscolo)? Di 'hash -t python' eseguire sia prima che dopo aver eseguito' python' con l'errore? Di usare 'dtrace' su Python? –

Problemi correlati