2011-10-12 59 views
11

任何人都可以解釋如何在我的機器上默認運行python 2.6嗎?它看起來像python指向2.7,所以看起來好像which沒有給我正確的信息。在bash中,「哪個」給出了一個不正確的路徑 - 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 

當我產生一個錯誤,我看到什麼是真正得到運行。爲什麼會這樣呢?

~> 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. 

我該如何糾正它?

----編輯:----

從建議的意見:

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

python別名爲2.6.5版本? – GreenMatt

+0

在出現提示時輸入'alias'。 – aioobe

+2

嘗試「輸入python」而不是「哪個python」。它會告訴你將要運行的實際內容,包括別名和shell函數,而'which'不會。 –

回答

20

Bash使用internal hash table來優化$PATH查找。當您在$PATH的較早版本中安裝與現有程序同名的新程序(在這種情況下爲python)時,Bash不知道它並繼續使用舊程序。 which可執行文件會執行完整的搜索並打印出預期的結果。

要解決此問題,請運行命令hash -d python。這會從Bash的哈希表中刪除python,並在下次調用它時強制它執行完整的$PATH搜索。或者,您也可以運行hash -r以完全清除哈希表。

type builtin會告訴你一個給定的命令將如何解釋。如果它說一個命令是散列的,那意味着Bash將跳過搜索可執行文件的$PATH

+0

看起來像改變爲「$ PATH」變量的錯誤不會自動清除哈希表。 –

+0

在我的Bash版本(Linux上的3.2.25)上,它的確如此。 –

+0

太棒了!感謝您的洞察! =) –

0

我只是檢查我的.bash_profile,它包含以下內容:

# 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 

評論此問題已解決我的問題。

如果有人能告訴我爲什麼whichtype仍然給出了不正確的答案,我會非常感激,並會給他們一個複選標記!

感謝您的指導!

+0

如果不從PATH中刪除它,那麼'which --all python'的結果是什麼(或者OS X等價物)? 'ls -l/opt/local/bin/python2.7'? 'file/opt/local/bin/python2.7'? python -v(小寫)? ''hash -t python'在運行'python'之前和之後都會運行錯誤?在Python上使用'dtrace'? –

相關問題