127

我开始学习python并喜欢它。我主要在 Mac 和 Linux 上工作。当我使用 apt-get 安装 python 模块时,我发现在 Linux(主要是 Ubuntu 9.04)上它工作正常。我可以毫无困难地导入它。

在 Mac 上,我习惯于使用 Macports 来安装所有 Unixy 的东西。但是,我发现我安装的大多数 python 模块都没有被 python 看到。我花了一些时间玩 PATH 设置和使用 python_select 。什么都没有真正奏效,在这一点上我还不是很了解,相反,我只是在四处闲逛。

我的印象是 Macports 在管理 python 模块方面并不普遍。我想使用更“被接受”(如果这是正确的话)的方法重新开始。

所以,我想知道,Mac python 开发人员用来管理他们的模块的方法是什么?

奖励问题:

您使用 Apple 的 python 还是其他版本?你是从源代码编译所有东西,还是有一个运行良好的包管理器(Fink?)。

4

13 回答 13

145

管理 python 包最流行的方法(如果你没有使用系统包管理器)是使用 setuptools 和 easy_install。它可能已经安装在您的系统上。像这样使用它:

easy_install django

easy_install 使用Python 包索引 ,这对于 python 开发人员来说是一个了不起的资源。环顾四周,看看有哪些可用的软件包。

一个更好的选择是pip,它正在获得牵引力,因为它试图解决许多与 easy_install 相关的问题。Pip 使用与 easy_install 相同的软件包存储库,它只是工作得更好。真正需要使用 easy_install 的唯一时间是这个命令:

easy_install pip

之后,使用:

pip install django

在某些时候,您可能想了解一些有关virtualenv的知识。如果你在包需求冲突的项目上进行大量 python 开发,virtualenv 是天赐之物。它将允许您拥有各种软件包的完全不同版本,并根据您的需要在它们之间轻松切换。

关于使用哪个 python,坚持使用 Apple 的 python 将不会让您头疼,但是如果您需要更新的版本(我相信 Leopard 是 2.5.1),我会使用macports python 2.6。

于 2009-07-31T17:20:22.917 回答
42

您的问题已经存在三年了,其他答案中没有涵盖一些细节:

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

MacPorts 只能在 Mac 中移植,但通过 easy_install 或 pip,您将学习如何在任何平台(Win/Mac/Linux/Bsd...)中设置您的环境。此外,它总是会更新并有更多的包

我个人让 MacPorts 处理我的 Python 模块以保持一切更新。像任何其他高级包管理器(即:apt-get)一样,它对于具有大量二进制依赖项的模块的繁重工作要好得多。我无法使用easy_install 或pip 构建我的Qt 绑定(PySide)。Qt 非常庞大,需要大量编译。一旦你想要一个需要非 Python 程序使用的库的 Python 包,尽量避免使用 easy_install 或 pip

在某些时候,您会发现 MacPorts 中缺少一些包。我不相信 MacPorts 会给你整个CheeseShop。比如最近需要Elixir模块,但是 MacPorts 只提供 py25-elixir 和 py26-elixir,没有 py27 版本。在这种情况下,您有:

pip-2.7 安装 --user elixir

(确保你总是输入 pip-(version) )

这将在您的主目录中构建一个额外的 Python 库。是的,Python 将使用多个库位置:一个由 MacPorts 控制,一个用户本地一个用于 MacPorts 中缺少的所有内容。

现在请注意,我更喜欢 pip 而不是 easy_install。您应该避免使用 setuptools 和 easy_install 是有充分理由的。这是一个很好的解释,我尽量远离他们。pip 的一个非常有用的功能是为您提供使用 MacPorts、easy_install 和 pip 本身安装的所有模块(及其版本)的列表:

pip-2.7 冻结

如果您已经开始使用 easy_install,请不要担心,pip 可以识别 easy_install 已经完成的所有操作,甚至可以升级使用它安装的软件包。

如果您是开发人员,请留意virtualenv以控制不同的设置和模块版本的组合。其他答案已经提到了它,到目前为止没有提到的是Tox模块,这是一个用于测试你的包在不同 Python 版本中正确安装的工具。

虽然我通常没有版本冲突,但我喜欢使用 virtualenv 来设置一个干净的环境并清楚地了解我的包依赖项。这样我就永远不会忘记 setup.py 中的任何依赖项

如果您选择 MacPorts,请注意不再选择同一个包的多个版本,就像带有额外 python_select 包的旧 Debian 风格(它仍然存在以保持兼容性)。现在您可以使用 select 命令来选择要使用的 Python 版本(您甚至可以选择 Apple 安装的版本):

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

$ port select python python32

在上面添加 tox,你的程序应该是真正可移植的

于 2011-08-28T09:13:47.760 回答
30

请参阅Python OS X 开发环境。最好的方法是使用MacPorts。下载并安装 MacPorts,然后通过 MacPorts 在终端中键入以下命令来安装 Python:

sudo 端口安装 python26 python_select
sudo 端口选择 --set python python26

或者

sudo 端口安装 python30 python_select
sudo 端口选择 --set python python30

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

sudo port install py26-packagename

或者

sudo port install py30-packagename

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

sudo 端口安装 py26-setuptools

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

有关 Python 可用包的完整列表,请键入:

港口清单 | grep py26-

或者

港口清单 | grep py30-

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

于 2009-07-31T17:25:10.053 回答
7

我使用 MacPorts 将 Python 和 MacPorts 跟踪的任何第三方模块安装到/opt/local中,并将任何手动安装的模块(不在 MacPorts 存储库中)安装到/usr/local中,这从未引起任何问题。我认为您可能对某些 MacPorts 脚本和环境变量的使用感到困惑。

MacPortspython_select用于选择 Python 的“当前”版本,但它与模块无关。例如,这允许您使用 MacPorts 安装 Python 2.5 和 Python 2.6,并在安装之间切换。

$PATH环境变量不会影响加载的 Python 模块。$PYTHONPATH就是你要找的。$PYTHONPATH应该指向包含要加载的 Python 模块的目录。就我而言,我的$PYTHONPATH变量包含/usr/local/lib/python26/site-packages. 如果你使用 MacPorts 的 Python,它会为你设置其他合适的目录,所以你只需要添加额外的路径到$PYTHONPATH. 但是,$PATH当 Python 搜索您已安装的模块时,根本不使用它。

$PATH 用于查找可执行文件,因此如果您安装 MacPorts 的 Python,请确保/opt/local/bin在您的$PATH.

于 2009-07-31T18:31:26.720 回答
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.

于 2009-07-31T18:26:32.130 回答
6

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

于 2010-03-04T14:51:18.940 回答
4

你有没有研究过easy_install?它不会同步你的 macport 或类似的东西,但它会自动下载最新的包和所有必要的依赖项,即

easy_install nose

对于鼻子单元测试包,或

easy_install trac

对于trac错误跟踪器。

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

于 2009-07-31T17:07:50.463 回答
3

对于 MacPython 安装,我在这篇博文中找到了解决 setuptools (easy_install) 问题的有效解决方案:

http://droidism.com/getting-running-with-django-and-macpython-26-on-leopard

一个方便的技巧包括找出终端中哪个版本的 python 处于活动状态:

which python
于 2009-08-16T00:44:05.587 回答
2

当您使用 MacPorts 安装模块时,它不会进入 Apple 的 Python 版本。而是将这些模块安装到所选 Python 的 MacPorts 版本上。

您可以使用名为python_select的 mac 端口更改默认使用的 Python 版本。这里的说明。

此外,还有easy_install。它将使用 python 来安装 python 模块。

于 2009-07-31T17:10:58.070 回答
2

您可能已经pip3预装了,所以试试吧!

于 2018-04-17T04:29:48.470 回答
1

关于使用哪个 python 版本,Mac OS 通常会提供旧版本的 python。升级到较新版本是个好主意。您可以从http://www.python.org/download/下载 .dmg 。如果这样做,请记住更新路径。你可以在这里找到确切的命令http://farmdev.com/thoughts/66/python-3-0-on-mac-os-x-alongside-2-6-2-5-etc-/

于 2009-07-31T17:23:02.367 回答
-1

我将easy_install与Apple 的Python 一起使用,它就像一个魅力。

于 2009-07-31T17:21:32.183 回答
-1

直接安装 fink 包之一(Django 1.6 as of 2013-Nov)

fink install django-py27
fink install django-py33

或者自己创建一个 virtualenv:

fink install virtualenv-py27
virtualenv django-env
source django-env/bin/activate
pip install django
deactivate # when you are done

或者在 virtualenv 中使用 fink django 以及任何其他 pip 安装包

fink install django-py27
fink install virtualenv-py27
virtualenv django-env --system-site-packages
source django-env/bin/activate
# django already installed
pip install django-analytical # or anything else you might want
deactivate # back to your normally scheduled programming
于 2013-11-06T15:53:01.090 回答