2017-08-01 56 views
3

在指示MacPorts切换到Python 3.4之后,python --version仍输出2.7.10。请注意,“这蟒蛇”它只表示的/ opt/local/bin目录之前来的/ usr/bin中/在我的道路:MacPorts表示,当运行“python --version”时,我仍然拥有Python 2.7

$ which python 
/opt/local/bin/python 
$ python --version 
Python 2.7.10 
$ ls -l /opt/local/bin/python 
lrwxr-xr-x 1 root wheel 24 Aug 1 10:00 /opt/local/bin/python -> /opt/local/bin/python2.7 
$ sudo port select --list python 
Available versions for python: 
    none 
    python26-apple 
    python27 (active) 
    python27-apple 
    python34 
$ sudo port select --set python python34 
Selecting 'python34' for 'python' succeeded. 'python34' is now active. 
$ which python 
/opt/local/bin/python 
$ python --version 
Python 2.7.10 
$ ls -l /opt/local/bin/python 
lrwxr-xr-x 1 root wheel 24 Aug 1 10:00 /opt/local/bin/python -> /opt/local/bin/python3.4 

注意符号链接怎么做改变,但所陈述的版本不会改变。是什么赋予了?

+2

尝试在符号链接更改后重新引导shell。 – Zcode

+0

是的!这工作。你能简单解释为什么shell每次都不重新读取符号链接吗? – Labrador

+0

我很抱歉,但我在GNU/Linux系统中是一个初学者,我知道当你创建一个别名时(例如在'bash_aliases'文件中),你必须刷新bash shell。 – Zcode

回答

3

tl; dr:运行hash -r


由于速度的原因,炮弹不断的可执行什么需要运行时键入python到外壳缓存。

考虑一下壳将有没有这样的缓存做:对于每一个命令(不是绝对路径),您输入,外壳必须

  1. 越过条目$PATH,并且对于每个条目
  2. 发出stat(2)系统调用以测试该命令是否存在于当前搜索的目录中。请记住,当最初开发shell时,这可能涉及缓慢的旋转磁盘或甚至网络文件系统。

加快这,大部分炮弹将只为每个命令这样做一次,直到$PATH被改变,或者你手动告诉shell下降缓存(例如,使用在bash hash -rrehash在其他一些贝壳) 。

虽然,但有消息告诉我一些shell也会缓存符号链接。

+0

但是,符号链接没有什么特别之处:shell将二进制文件的路径缓存起来,无论这个二进制文件是普通文件(即实际的二进制文件)还是符合真正的底层二进制文件的符号链接。 – mklement0

+0

好吧,'sudo port select --set python34'改变了'/ opt/local/bin/python'符号链接的目标,而shell将'python'映射到'/ opt/local/bin/python'。所以如果shell没有在缓存中扩展这个符号链接,'python --version'应该返回3.4。但是它打印了2.7,所以bash必须在缓存中有符号链接'/ opt/local/bin/python - > python2.7'。 – neverpanic

+0

这是一个好点,谢谢,我没有注意到这个矛盾。但是,我无法重新创建这个问题:''hash -l'会将缓存的路径列为符号链接(如果适用),甚至以下测试命令也会使符号链接的目标立即生效(在Bash v3.2.57和v4.3.42上进行了验证,从包含在PATH中的文件夹运行):'ln -f -s $(which date)btmp; BTMP; ln -s -f $(which whoami)btmp; BTMP; rm btmp'。 – mklement0

相关问题