在Mac OS X上管理Python - 环境和库设置

21 投票
4 回答
9534 浏览
提问于 2025-04-16 02:49

我最开始在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 个回答

1

我刚刚使用了'pythonbrew',这是我用系统自带的Python在10.6.7上轻松安装的。不过,我必须使用'--force'这个选项来跳过编译后的测试,因为在测试过程中出现了test_dl和test_readline的错误(我快速查了一下,发现这些似乎并不是大问题)。

$ sudo easy_install pythonbrew

安装完成后,运行这个命令可以获取更多说明:

$ pythonbrew_install

所以现在我有了一个独立的python-2.7.1安装,它不会干扰到系统自带的Python。

2

这是一个老问题,但我过去在升级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等的包。当然,也可能有这样的包。具体情况可能会有所不同。希望这个方法对你有用。

17

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 或者来自 Distributesetuptoolseasy_install 命令)。每个工具都会安装到默认的脚本目录(即框架的 bin 目录)。当你安装 MacPorts 版本的包时,它会自动处理这些(例如 sudo port install py26-pipsudo port install py31-distribute)。需要注意的是,苹果在 /usr/bin 中提供了一组 easy_install 的链接,它们会将包安装到 /Library/Python。你需要确保使用适合你 Python 实例的 easy_installpip。确保实例的框架 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 库。例如,MySQLdbPIL 包在 Mac OS X 上常常会遇到问题,因为涉及到 MySQL 客户端库和 libjpeg,但 MacPorts 让这一切变得简单多了。不过,你可以选择直接使用 MacPorts 安装(sudo port py26-pil),或者通过 pipsudo pip install pil)或 easy_install,或者下载源代码自己安装(sudo python setup.py ...)。因为这些方法背后都使用 Python 的 Distutils 来处理这些工作,所以通常所有这些方法都会将包的文件安装到同一个位置,针对特定的 Python 实例。

撰写回答