在Mac上安装Python模块的最兼容方式是什么?

127

我开始学习Python并且很喜欢。我主要使用Mac和Linux。我发现在Linux(主要是Ubuntu 9.04)上,使用apt-get安装Python模块可以正常工作,也无需麻烦。

而在Mac上,我习惯使用Macports来安装所有Unixy的东西。但是,我发现大多数使用它安装的Python模块都无法被Python识别。我已经花费了一些时间尝试调整PATH设置并使用python_select命令,但都没有真正起到效果。目前我并没有明确的理解,只是在试错。

我认为Macports不是管理Python模块的最佳方式,希望能借此机会使用更加“普遍接受”的方式进行管理。

所以,我想问问,Mac Python开发者用何种方法来管理他们的模块?

附加问题:

你使用苹果的Python还是其他版本?你从源代码编译所有内容,还是有一个可靠的软件包管理器(如Fink)可用?


有一篇很好的文章介绍如何在Mac OS X上打包PyQt应用程序,它曾经在Ars Technica上发表过:http://arstechnica.com/open-source/guides/2009/03/how-to-deploying-pyqt-applications-on-windows-and-mac-os-x.ars - Todd Gamblin
7
MacPorts 是在 Mac 上使用 Python 的完美选择。注意:如果要将 Python 包安装到 MacPorts 中,必须通过 MacPorts 安装它们。您也可以在不使用 MacPorts 的情况下安装包;但是,在安装包之前,需要通过 python_select 将该版本的 Python 设置为默认版本。如果您先安装了包,然后再使用 python_select,这并没有区别,因为它会安装到安装时默认的 Python 版本中。 - Michael Aaron Safyan
13个回答

145

如果您不使用系统包管理器,最流行的管理Python软件包的方法是使用setuptools和easy_install。它可能已经安装在您的系统上。使用以下方式:

easy_install django

easy_install使用Python Package Index,对于Python开发者来说是一个非常棒的资源。请浏览一下查看现有的包。

更好的选择是pip,它正在得到越来越多的关注,因为它试图解决很多问题,这些问题与easy_install有关。Pip使用与easy_install相同的软件包存储库,只不过工作效果更好。实际上,唯一需要使用easy_install的时间是在运行此命令时:

easy_install pip

之后,使用:

pip install django

在某个时候,您可能会想学习一些关于虚拟环境的知识。如果您在具有冲突的软件包要求的项目中进行大量Python开发,则虚拟环境是救星。它将允许您拥有完全不同版本的各种软件包,并根据需要轻松切换。

关于使用哪个Python版本,坚持使用Apple自带的Python将使您避免很多麻烦,但如果您需要更新的版本(我认为Leopard是2.5.1),我建议使用macports的Python 2.6版本。


5
最近我重新构建了我的计算机,并开始只使用Homebrew和PIP,突然间我之前遇到的所有构建问题都消失了。 - GloryFish

42

您的问题已经三年了,其他答案中有些细节没有涉及:

我认识的大多数人都使用HomeBrewMacPorts,我更喜欢MacPorts,因为它干净地切割了默认的Mac OS X环境和我的开发设置。只需移出您的/opt文件夹并用普通用户Python环境测试您的程序包。

MacPorts仅在Mac内部可移植,但使用easy_install或pip,您将学习如何在任何平台(Win/Mac/Linux/Bsd...)上设置您的环境。此外,它始终会更加更新和具备更多的程序包。

我个人使用MacPorts来管理我的Python模块以确保所有内容都是最新的。与任何其他高级程序包管理器(例如:apt-get)一样,它非常适合处理具有许多二进制依赖项的模块。如果您想要一个需要由非Python程序使用的库支持的Python软件包,尽量避免使用easy_install或pip。

在某些时候,您会发现MacPorts中缺少一些程序包。我不相信MacPorts会提供完整的CheeseShop。例如,最近我需要Elixir模块,但是MacPorts仅提供了py25-elixir和py26-elixir版本,没有py27版本。在这种情况下,您可以使用以下命令:

pip-2.7 install --user elixir

(确保您始终输入pip-(version))

这将在您的主目录中构建一个额外的Python库。是的,Python可以处理多个库位置:由MacPorts控制的和本地用户缺失于MacPorts之外的位置。

现在,请注意,我喜欢使用pip而不是easy_install。有一个很好的理由要避免setuptools和easy_install。这里是一个好的解释,而我尽量避免它们。pip非常有用的一个特性是,它可以给您提供一个列表,其中包含所有已使用MacPorts、easy_install和pip自身安装的模块(以及它们的版本):

pip-2.7 freeze

如果您已经开始使用easy_install,不用担心,pip可以识别已经使用easy_install安装的所有内容,甚至升级已经安装的软件包。

如果您是开发人员,请关注virtualenv以控制不同设置和模块版本的组合。其他答案已经提到了它,但迄今为止还没有提到的是Tox模块,这是一个测试您的软件包是否能够在不同的Python版本上正确安装的工具。

虽然我通常没有版本冲突,但我喜欢使用virtualenv来设置干净的环境,并清楚地查看我的程序包依赖项。这样,我就不会忘

$  port select python
Available versions for python:
    none
    python25-apple
    python26-apple
    python27 (active)
    python27-apple
    python32

$ port select python python32

在其之上添加tox,你的程序就能真正地实现可移植性。


30
请查看Python OS X development environment。 最好的方法是使用MacPorts。下载并安装MacPorts,然后在终端中输入以下命令通过MacPorts安装Python:

sudo port install python26 python_select
sudo port select --set python python26

或者

sudo port install python30 python_select
sudo port select --set python python30

使用第一组命令安装Python 2.6,使用第二组命令安装Python 3.0。 然后使用:

sudo port install py26-packagename

或者

sudo port install py30-packagename

在上述命令中,将packagename替换为软件包的名称,例如:

sudo port install py26-setuptools

这些命令将自动为给定的Python版本安装软件包(及其依赖项)。

要获取Python可用软件包的完整列表,请键入:

port list | grep py26-

或者

port list | grep py30-

您使用的命令取决于您选择安装哪个Python版本。


1
仅供参考,在最新的MacPorts版本中,sudo python_select python30已被替换为sudo port select --set python python30 - Benjamin Hodgson

7
我使用MacPorts安装Python和MacPorts跟踪的任何第三方模块到/opt/local,我将所有手动安装的模块(不在MacPorts存储库中的模块)安装到/usr/local,这从未引起过任何问题。我认为你可能对某些MacPorts脚本和环境变量的使用感到困惑。
MacPorts的python_select用于选择“当前”版本的Python,但它与模块无关。这允许您例如使用MacPorts同时安装Python 2.5和Python 2.6,并在两者之间切换。 $PATH 环境变量不会影响加载哪些Python模块。您要找的是$PYTHONPATH$PYTHONPATH 应指向包含要加载的Python模块的目录。在我的情况下,我的$PYTHONPATH变量包含/usr/local/lib/python26/site-packages。如果您使用MacPorts的Python,则它会为您设置其他正确的目录,因此您只需要将额外路径添加到$PYTHONPATH。但是,请注意,在Python搜索您已安装的模块时,根本不使用$PATH$PATH被用来查找可执行文件,因此如果您安装了MacPorts的Python,请确保将/opt/local/bin添加到您的$PATH

6

使用MacPorts Python安装没有任何问题。如果您正在从MacPorts安装Python模块,但是却看不到它们,那很可能是因为您没有调用已经安装的MacPorts Python。在终端Shell中,您可以使用绝对路径来调用可能已经安装的各种Python版本。例如:

$ /usr/bin/python2.5         # Apple-supplied 2.5 (Leopard)
$ /opt/local/bin/python2.5   # MacPorts 2.5
$ /opt/local/bin/python2.6   # MacPorts 2.6
$ /usr/local/bin/python2.6   # python.org (MacPython) 2.6
$ /usr/local/bin/python3.1   # python.org (MacPython) 3.1

要默认获取正确的python版本,需要确保您的shell $PATH设置正确,以确保找到正确的可执行文件。另一种解决方案是定义不同python版本的shell别名。
像其他人建议的那样,python.org (MacPython)安装也可以。easy_install可能会有所帮助,但是因为每个Python实例可能都有自己的easy_install命令,所以请确保调用正确的easy_install命令。

2
如果他使用MacPorts,则使该Python版本成为默认版本的正确方法不是处理PATH,而是安装“python_select”,并让它自动切换必要的符号链接以使该Python版本成为默认版本。 - Michael Aaron Safyan
3
python_select 只能管理 /opt/local/bin 中的 Python 符号链接,并不能保证 /opt/local/bin 在 $PATH 中的顺序在 /usr/local/bin 或 /usr/bin 之前(尽管 MacPorts 的初始安装会尝试这样做)。由于存在多个版本可用,因此通常仅使用 "python" 或甚至 "python2.5" 不太可靠:除非您了解 $PATH 的陷阱和/或使用绝对路径,否则您不知道您将得到哪个 Python 版本。 - Ned Deily

6
如果您使用MacPorts中的Python,它有自己的easy_install位于:/opt/local/bin/easy_install-2.6(对于py26而言)。即使您使用python_select更改了默认的python命令,这也不是直接调用easy_install的相同命令。

1
对于pip也是同样的道理。在我的MacPorts设置中,我运行pip-2.6(位于/opt/local/bin/)来安装与MacPorts python兼容的python模块。您可以使用“sudo port install py2.6-pip”来获取pip。 - zlovelady

4

你有没有考虑过使用easy_install?它不会同步你的macports或其他内容,但它可以自动下载最新的软件包和所有必要的依赖项,也就是说:

easy_install nose

对于鼻子单元测试包,或者
easy_install trac

针对 trac 缺陷跟踪器。

在他们的 EasyInstall 页面上还有更多信息。


1
easy_install没问题。只需注意,就像您可能安装了多个版本的Python一样,很容易安装多个版本的easy_install,每个版本都与不同的Python安装/版本相关联。您只需要确保了解您正在调用哪个版本(which(1)可以帮助您)。 - Ned Deily

3

2
当您使用MacPorts安装模块时,它不会安装到Apple自带的Python中。相反,这些模块会安装到所选的MacPorts版本的Python上。
您可以使用名为python_select的Mac端口更改默认使用的Python版本。操作说明在此
此外,还有easy_install,它将使用Python安装Python模块。

python_select 已弃用,请查看更新的答案。 - askewchan

2

您可能已经预先安装了pip3,所以请尝试使用它!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接