在Mac OS X上管理Python - 环境和库设置
我最开始在Ubuntu Linux上学习Python,现在已经在Mac上工作了一段时间,目前是Mac OS X 10.6。不幸的是,我没有好好关注Python在这儿是怎么安装的,结果搞成了这样:
- 在
/usr/bin
里有Python 2.6.1(这是Mac自带的版本吗?),还有2.5.4,我也不知道它是怎么来的。 - 通过MacPorts安装的Python 2.6.5,放在
/opt/local/bin/
里。这是我默认使用的版本。 - 我用
pip
来安装库,但它们被放在一个很奇怪的地方(像是/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/
- 真的有点夸张吧?) - 其他方面,我主要用TextMate和Git来进行版本控制,还用Django和Google App Engine等等……
现在我准备安装2.7和3.2版本,但对这种杂乱的状态感到不满意。那么,你们有什么好的方法来整理代码和库吗?你们是怎么让Mac变得听话的?
我想继续使用pip
,但希望能更好地控制或者至少理解哪些库是为哪个版本安装的,以及它们是从哪里被访问的:我在通过pip
安装py.test
时遇到问题,只能从过时的2.6.1版本加载,而不是我现在的2.6.5版本。MacPorts有python_select
,但用处不大:
reason: chris$ python_select -l
Available versions:
current none python26 python26-apple
我问过的大多数Python用户都不使用MacPorts,他们更喜欢从python.org
下载的Mac自带Python。我还听说有人推荐系统性地使用virtualenv
,那么有没有好的实用入门链接呢?
4 个回答
我刚刚使用了'pythonbrew',这是我用系统自带的Python在10.6.7上轻松安装的。不过,我必须使用'--force'这个选项来跳过编译后的测试,因为在测试过程中出现了test_dl和test_readline的错误(我快速查了一下,发现这些似乎并不是大问题)。
$ sudo easy_install pythonbrew
安装完成后,运行这个命令可以获取更多说明:
$ pythonbrew_install
所以现在我有了一个独立的python-2.7.1安装,它不会干扰到系统自带的Python。
这是一个老问题,但我过去在升级Python和虚拟环境时遇到过不少麻烦。现在我已经找到了一些适合我工作的解决办法。希望这些能帮助到其他人。
设置:
在10.14版本的Mac上
Python 3.7
各种包:Pandas、IPython、Paramiko等等。
Python:
只需去Python.org下载他们提供的安装程序。点击macOS的“下载”按钮,下载包后按照安装程序的提示一步步操作。就这么简单。当需要升级到下一个Python 3版本时,重复这个过程就行了。
要在命令行中使用Python3的解释器,而不是Python2,记得用python3
,而不是python
。
删除旧的Python3版本
如果你不想让旧的Python版本留在电脑上,可以打开应用程序文件夹,把不想要的旧Python3版本拖到垃圾桶里。注意:不要随便删除Python2的版本,除非你知道自己在做什么。因为有些是系统自带的,删掉可能会出问题。
安装包:
@Ned Deily建议使用虚拟环境,这个主意不错,可以让安装包变得更简单。Python2的虚拟环境工具叫'virtualenv',而在Python3中叫'venv'。
第一步:
创建一个文件夹来存放你的所有虚拟环境。虽然这不是必须的,但这样可以帮助我管理。根据我是在为Python2还是Python3安装包,我会分别创建两个文件夹,叫'virtenvs'和'venvs'。在这个例子中,我们使用Python3:
cd ~
mkdir venvs
cd venvs
现在,我会根据我的项目或我安装的主要包来命名我的虚拟环境。为了这个例子,我们就叫它'project1':
venv project1
第二步:
使用以下命令“激活”虚拟环境。每次你打开新的终端或会话时,都需要执行这个步骤。
source ~/venvs/project1/bin/activate
Pip更新得很频繁,所以要更新它:
pip install --upgrade pip
第三步:
现在你可以开始在新的虚拟环境中安装包了:
pip install pandas
等等。
当你完成或者想切换到其他虚拟环境时,只需输入:
deactivate
接下来:
可以在网上查找更多关于Python虚拟环境的信息。使用这种方法,我没有遇到需要MacPorts、Anaconda等的包。当然,也可能有这样的包。具体情况可能会有所不同。希望这个方法对你有用。
virtualenv
是一个很棒的工具,特别适合在大多数平台上管理多个 Python 版本。不过在 Mac OS X 上,事情就有点复杂了,因为使用框架构建的方式,常常会遇到同一个主要版本的多个 Python 实例。在深入了解 virtualenv
之前,我建议你先了解并熟悉如何在 Mac OS X 上管理框架安装。
"/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/
- 真的?"
没错,这就是在 Python 的 Mac OS X 框架构建中的默认位置。大多数在 Mac OS X 上分发的 Python 都使用 框架构建,每个通常使用不同的根目录,这样可以更简单地支持多个版本,并将特定 Python 实例的所有库文件放在一起。
对于 Mac OS X 10.6,苹果提供了 Python 2.6(根目录在 /System/Library/Frameworks/Python.framework
,并链接到 /usr/bin/python2.6
),还有 Python 2.5(为了兼容 Mac OS X 10.5 - 你看到的 /usr/bin/python2.5
)。从 python.org 下载的 Mac OS X 安装包会安装到 /Library/Frameworks/Python.framework
。而 MacPorts 则使用 /opt/local/Library/Frameworks/Python.framework
。
这些框架中包含一个 bin
目录(在框架中的 ../Versions/x.x/bin
),通常这是包脚本安装的默认位置,也是解释器二进制文件的链接所在。
这里是一个 python.org 风格的框架,里面安装了多个版本的 Python:
$ cd /Library/Frameworks/Python.framework/Versions/
$ ls -l
total 8
drwxrwxr-x 8 root admin 340 Dec 23 2008 2.5/
drwxrwxr-x 8 root admin 340 Aug 10 21:42 2.6/
drwxrwxr-x 8 root admin 340 Jul 3 12:24 2.7/
drwxrwxr-x 7 root admin 306 Mar 23 17:42 3.1/
drwxrwxr-x 7 root admin 306 Aug 10 22:14 3.2/
lrwxr-xr-x 1 root admin 3 Aug 10 21:47 Current@ -> 2.6
$ cd 2.6
$ ls -l
total 7776
lrwxr-xr-x 1 root admin 17 Aug 10 21:47 Headers@ -> include/python2.6
drwxrwxr-x 3 root admin 102 Aug 10 21:42 Mac/
-r-xrwxr-x 1 root admin 3973552 Aug 10 21:41 Python*
drwxrwxr-x 4 root admin 170 Aug 10 21:48 Resources/
drwxrwxr-x 2 root admin 578 Aug 12 15:19 bin/
drwxrwxr-x 3 root admin 102 Aug 10 21:42 include/
drwxrwxr-x 3 root admin 646 Aug 10 21:43 lib/
drwxrwxr-x 3 root admin 102 Aug 10 21:41 share/
$ ls -l bin
total 264
-rwxrwxr-x 1 root admin 150 Aug 10 21:41 2to3*
-rwxr-xr-x 1 nad admin 360 Aug 12 15:19 easy_install*
-rwxr-xr-x 1 nad admin 368 Aug 12 15:19 easy_install-2.6*
lrwxr-xr-x 1 root admin 7 Aug 10 21:47 idle@ -> idle2.6
-rwxrwxr-x 1 root admin 138 Aug 10 21:41 idle2.6*
lrwxr-xr-x 1 root admin 8 Aug 10 21:47 pydoc@ -> pydoc2.6
-rwxrwxr-x 1 root admin 123 Aug 10 21:41 pydoc2.6*
lrwxr-xr-x 1 root admin 9 Aug 10 21:47 python@ -> python2.6
lrwxr-xr-x 1 root admin 16 Aug 10 21:47 python-config@ -> python2.6-config
-rwxrwxr-x 1 root admin 29584 Aug 10 21:43 python2.6*
-rwxrwxr-x 1 root admin 1463 Aug 10 21:42 python2.6-config*
lrwxr-xr-x 1 root admin 10 Aug 10 21:47 pythonw@ -> pythonw2.6
-rwxrwxr-x 1 root admin 29584 Aug 10 21:43 pythonw2.6*
lrwxr-xr-x 1 root admin 11 Aug 10 21:47 smtpd.py@ -> smtpd2.6.py
-rwxrwxr-x 1 root admin 18272 Aug 10 21:41 smtpd2.6.py*
这是一个 MacPorts 的 bin
目录,里面包含了一些额外的库文件:
$ cd /opt/local/Library/Frameworks/Python.framework/Versions/2.6
$ ls -l bin
total 952
-rwxr-xr-x 2 root wheel 160 Jul 15 01:56 2to3*
-rwxr-xr-x 2 root wheel 1541 Jun 8 19:59 apirst2html.py*
-rwxr-xr-x 2 root wheel 363 Oct 5 2009 bdist_mpkg*
[...]
-rwxr-xr-x 2 root wheel 211 Jun 2 12:45 django-admin.py*
-rwxr-xr-x 2 root wheel 410 Jul 15 17:30 easy_install*
-rwxr-xr-x 2 root wheel 418 Jul 15 17:30 easy_install-2.6*
[...]
-rwxr-xr-x 2 root wheel 368 Jun 24 02:00 pip*
-rwxr-xr-x 1 root wheel 342 Sep 18 2009 pkginfo*
[...]
lrwxr-xr-x 1 root wheel 9 Jul 15 01:58 python@ -> python2.6
lrwxr-xr-x 1 root wheel 16 Jul 15 01:58 python-config@ -> python2.6-config
-rwxr-xr-x 2 root wheel 24932 Jul 15 01:57 python2.6*
-rwxr-xr-x 2 root wheel 1473 Jul 15 01:57 python2.6-config*
[...]
如果你使用 python.org 的安装包或 MacPorts 安装 Python 2.7 或 3.1,它们都会在 /Library/Frameworks
或 /opt/local/Library/Frameworks
下,并且可以与其他版本共存。要成功使用框架安装,你需要管理你的 shell PATH
。特别是,你需要确保你想使用的 Python 的框架 bin
目录在你的 PATH
中。因此,对于 MacPorts,你可以在 ~/.bash_profile
中添加类似这样的内容:
export PATH="/opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin:/opt/local/bin:$PATH
或者对于 python.org 的安装包:
export PATH="/Library/Frameworks/Python.framework/Versions/2.6/bin:$PATH
此外,通常你需要为每个使用的 Python 实例安装一个单独版本的你喜欢的 Python 包管理工具(比如 pip
或者来自 Distribute
或 setuptools
的 easy_install
命令)。每个工具都会安装到默认的脚本目录(即框架的 bin
目录)。当你安装 MacPorts 版本的包时,它会自动处理这些(例如 sudo port install py26-pip
或 sudo port install py31-distribute
)。需要注意的是,苹果在 /usr/bin
中提供了一组 easy_install
的链接,它们会将包安装到 /Library/Python
。你需要确保使用适合你 Python 实例的 easy_install
或 pip
。确保实例的框架 bin
目录在 PATH
的最前面可以保证这一点。
如果你使用 MacPorts,你 可以 使用它的 python_select
命令来管理 /opt/local/bin/python
指向哪个 Python 实例。这样,如果 /opt/local/bin
在你的 PATH 列表中比其他包含 python
的目录靠前,它就会决定你的默认 python
是哪个。不过,你真的需要通过添加框架 bin
目录来管理 PATH,所以 python_select
通常不是特别有用。
使用 MacPorts(或类似的广泛分发工具)的另一个好处是,它提供了许多流行的 Python 包,包括处理一些复杂的细节,比如构建和链接那些 Mac OS X 没有自带的第三方 C 库。例如,MySQLdb
和 PIL
包在 Mac OS X 上常常会遇到问题,因为涉及到 MySQL 客户端库和 libjpeg
,但 MacPorts 让这一切变得简单多了。不过,你可以选择直接使用 MacPorts 安装(sudo port py26-pil
),或者通过 pip
(sudo pip install pil
)或 easy_install
,或者下载源代码自己安装(sudo python setup.py ...
)。因为这些方法背后都使用 Python 的 Distutils
来处理这些工作,所以通常所有这些方法都会将包的文件安装到同一个位置,针对特定的 Python 实例。