Mac上修改Path,及用Pyenv管理多版本Python

目前二刷《笨方法》即将结束,但是在Round1时遭遇的问题一直没有解决。问题是这样的:

在ex46中,要求安装若干个第三方库(如nose用来测试)。我按步骤安装之后,执行nosetest(nose的测试命令),反馈command not found。其他几个库问题亦然。

之前研究了很久不明白怎么回事,现在终于搞清楚,并快速修复了这个问题。
其实问题的核心就是Mac上Python的Path与第三方库(及第三方Python)的目录不统一,换句话说,当我在终端执行Python后,进入的是Mac OSX自带的Python的交互模式,而非手动安装的版本。自带的版本往往是比较旧(然而绝对绝对不能删除,手残党也尽量别去尝试更新了)的稳定版。
官方文档清晰的描述了Mac自带Python与用户手动安装Python的异同(https://docs.python.org/2.7/using/mac.html):

  1. Mac自带的Python用以支撑苹果官方及第三方软件(就是给电脑用的,不是专门给你编程用的!虽然也可以编程!),目录位置是 /System/Library/Frameworks/Python.framework 和 /usr/bin/python;
  2. 用户自行安装的第三方Python则当然用于编程,目录位置/Library/Frameworks/Python.framework 。

在官方文档中对于Mac OSX自带Python又着重强调了一句:You should never modify or delete these, as they are Apple-controlled and are used by Apple- or third-party software.
故而,问题很清晰了,只要修改日常代码所用的Python的路径为第三方Python路径即可。
修改Path的命令,我是在stackoverflow上面找到的(http://stackoverflow.com/questions/3696124/changing-python-path-on-mac)。

PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH

注意,上述路径中的2.7数字,根据你自己的安装版本进行调整。如果安装的是3.5,就改成3.5。
ps. 经测试发现,上述命令没有写入配置文件.bash_profile,因此只是临时更改了path,关闭终端(我用的iterm2)后再重启,依然会恢复老path。此时需要修改配置文件.bash_profile。执行以下命令:

open ~/.bash_profile

此时会用Mac自带的文本编辑器打开配置文件,在最后一行添加:

export PATH=/Library/Frameworks/Python.framework/Versions/2.7/bin:$PATH

具体路径参考自己的安装位置,基本应该差不多。然后保存文件并关闭。此时新Path已经被写入配置,关闭终端、重新打开,执行which python,可以查看目前的path。如果改过来了,即成功,否则请检查自己的步骤哪里有错。
注意,以上步骤仅供Mac用户参考,Mac的终端配置文件是.bash_profile,而没有很多中英文教程中提到的.bashrc,请注意。
附录:.bash_profile与.bashrc的区别:http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html


另外,我个人的下一本学习教程是朱老师推荐的《Automate the boring stuff》,教材中以Python3为标准,因此可能需要一段时间让Python2与3共存和切换,因此也记录一下知乎上推荐的Python版本切换工具,Pyenv(Github地址)。目前我还没有安装,大概这两天会试用。


报告各位,已经完成用Pyenv管理多版本的Python。中间绕过一些弯路,请各位严格按照下列顺序操作,否则可能导致前功尽弃、从头来过。
另外,强烈建议看一遍pyenv的Github说明,因为我下面的步骤仅针对Mac,如果你跟我情况不同,请按官方教程来。

首先,看看你有没有自己安装过Python,如果有,删掉!

在Python的官方文档中,并没有一章专门讲怎样卸载Python,因为放在安装章节了(这里)……懒得看英文的可以看下面。

  1. 删除Applications文件夹下面的Python文件夹。(打开Finder,点击应用程序,将Python27/Build Applet/IDLE都拖进垃圾桶)
  2. 删除/Library/Frameworks/Python.framework下面以Python版本号命名的对应文件夹。(例如你想删Python2.7,就把27这个文件夹删除。在本教程中,除了Current文件夹以外,所有版本都删掉!)
  3. 删掉上文中那句加在~/.bash_profile文件中的那行代码

然后,安装包管理工具Homebrew(已安装的跳至下一步)

  1. 进入Homebrew官网http://brew.sh/index_zh-cn.html
  2. 把首页那行代码复制到终端,然后执行
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  3. 此时已经安装好Homebrew了

用Homebrew安装Pyenv

  1. 直接用brew命令安装
    $ brew update
    $ brew install pyenv
  2. 将以下代码添加到~/.bash_profile文件的第一行(让bash运行后首先加载pyenv自己的path)
    eval "$(pyenv init -)"

用Pyenv安装需要的Python版本

  1. 查看可安装的Python版本列表,其中形如 x.x.x 这样的只有版本号的为Python官方版本,其他的形如 xxxxx-x.x.x 这种既有名称又有版本后的属于“衍生版”或发行版。
    $ pyenv install --list
  2. 截至今天2016/1/15,Python最新版本是3.5.1,以安装这个版本为例
    $ pyenv install 3.5.1
  3. 如果有其他版本需求,用同样的命令安装其他的,例如2.7.11。
  4. 最后更新数据库
    $ pyenv rehash

Pyenv切换Python版本

  1. 查看Pyenv下面已存在的Python版本
    $ pyenv versions
  2. 切换版本
    $ pyenv global 3.5.1
  3. 再执行python,看一看Python版本有没有切换过来?

删除Pyenv

我还没有删除过Pyenv,所以在此只是翻译一下官方文档:

  1. 删除之前添加在~/.bash_profile文件第一行的那行代码
  2. 如果是用git clone命令安装的,请删除pyenv的整个根目录(一般是~/.pyenv)
    rm -rf `pyenv root`
  3. 如果你是按照我上面的步骤用Homebrew安装的,直接用brew来卸载即可
    brew uninstall pyenv

 

Tagged : /