2011-10-12 28 views
11

Bất cứ ai có thể giải thích cách python 2.6 có thể chạy theo mặc định trên máy của tôi không? Có vẻ như python điểm là 2,7, vì vậy có vẻ như which không cung cấp cho tôi thông tin chính xác.Trong bash, "cái nào" cho một đường dẫn không chính xác - Các phiên bản 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 

Khi tôi tạo lỗi, tôi thấy điều gì thực sự đang chạy. Tại sao điều này có thể?

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

Và làm cách nào để khắc phục?

---- Edit: ----

Từ gợi ý trong ý kiến:

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

Con trăn có được đặt bí danh với phiên bản 2.6.5 không? – GreenMatt

+0

nhập 'bí danh' tại dấu nhắc để tìm hiểu. – aioobe

+2

Thử 'gõ python' thay vì' trăn'. Nó sẽ cho bạn thấy điều thực sự sẽ chạy, bao gồm các bí danh và các hàm hệ vỏ, trong khi 'đó' thì không. –

Trả lời

20

Bash sử dụng số internal hash table để tối ưu hóa việc tìm kiếm $PATH. Khi bạn cài đặt một chương trình mới có cùng tên với chương trình hiện có (python trong trường hợp này) trước đó trong số $PATH, Bash không biết về chương trình đó và tiếp tục sử dụng chương trình cũ. Tệp thực thi which thực hiện tìm kiếm đầy đủ $PATH và in ra kết quả mong muốn.

Để khắc phục điều này, hãy chạy lệnh hash -d python. Điều này sẽ xóa python khỏi bảng băm của Bash và buộc nó thực hiện tìm kiếm đầy đủ $PATH vào lần tiếp theo bạn gọi nó. Ngoài ra, bạn cũng có thể chạy hash -r để xóa hoàn toàn bảng băm.

type builtin sẽ cho bạn biết cách một lệnh nhất định sẽ được diễn giải. Nếu nó nói rằng một lệnh được băm, điều đó có nghĩa là Bash sẽ bỏ qua tìm kiếm $PATH để thực thi.

+0

Dường như một lỗi thay đổi thành biến '$ PATH' không tự động xóa bảng băm. –

+0

Trên phiên bản Bash của tôi (3.2.25 trên Linux), nó có. –

+0

Tuyệt vời! Cảm ơn sự thấu hiểu! =) –

0

tôi chỉ kiểm tra .bash_profile của tôi, và nó chứa đựng những điều sau đây:

# 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 

Nhận xét điều này đã khắc phục được sự cố của tôi.

Nếu ai đó có thể cho tôi biết lý do tại sao whichtype vẫn trả lời không chính xác, tôi rất biết ơn và sẽ cung cấp cho họ dấu kiểm!

Cảm ơn bạn đã hướng dẫn!

+0

Nếu không loại bỏ nó khỏi PATH của bạn, kết quả của' which --all python' (hoặc là Tương đương OS X)? Trong số 'ls -l/opt/local/bin/python2.7'? Trong 'tệp/opt/local/bin/python2.7'? Của 'python -v' (chữ thường)? 'Hash -t python' chạy cả trước và sau khi chạy' python' với lỗi? Sử dụng 'dtrace' trên Python? –

Các vấn đề liên quan