初学者在OSX上使用Python包管理的常识性建议

3 投票
3 回答
1143 浏览
提问于 2025-04-16 10:50

如果我在OSX(Snow Leopard)上学习Python开发,我该如何更好地管理我的Python包呢?

我对市面上有那么多优秀的Python包感到非常兴奋。我想开始学习它们,但包管理让我完全困惑。显然,我对这方面一无所知。我在Stack Overflow上看到很多关于包管理的问题,很多人回答时常常说:“你为什么不直接用x呢?看看我从命令行复制过来的这一行是多么简单。”

$ x install something

这听起来是个不错的答案,但当x无法处理某些特定的依赖关系,或者无法处理包y时,就不那么好用了。以下是我已经尝试过的:

  1. 我最开始只是用easy_install来安装东西。
  2. 我很快发现一些重要的包缺少依赖(比如PIL),于是我四处寻找,发现了MacPorts
  3. 我开始使用MacPorts,但我的环境变量变得非常混乱,所以我学了一些bash命令,重新配置了PATHPYTHONPATHsys.path,让一切正常工作(还让我的终端窗口看起来不错)。一开始MacPorts看起来很不错。
  4. 但后来我对不同模块的版本感到困惑,还发现了更多的依赖问题(比如GDAL)……
  5. 然后有几位非常聪明的人强烈建议我换用Homebrew。于是我卸载了MacPorts,安装了Homebrew。
  6. 现在我有了Homebrew,但似乎什么都装不了,因为我不知道如何为我想用的大多数Python包创建Formula。如果一个包在pypi上列出,我不知道我是否应该真的使用Homebrew,还是只需弄清楚如何配置easy_install以安装到Homebrew目录。而且我仍然不知道如何最好地处理缺失的依赖。也许有某个秘密的与Python相关的Formula库?或者有什么简单的方法可以将portfiles转换成Formula?

我知道正确的答案可能取决于我想安装的内容。我想安装一组包,让我可以:

  1. 用Python玩耍和自动化所有事情
    • appscript
    • PIL
    • pygame
  2. 在Python中做与地理信息系统(GIS)相关的工作
    • gdal
    • shapely
    • postgis
    • scipy
  3. 探索网络应用的奇妙可能性
    • django
    • google-app-engine

我完全愿意把我机器上的一切都清除掉,因为现在可能已经堆满了各种包的残余。如果我应该学习virtualenv,或者只是多了解一下检查依赖和自己安装的基本过程,我都很乐意去做。如果我应该深入研究Homebrew,我也很乐意这样做。我该如何处理这些问题,这些问题常常阻止我做我真正想做的事情(用Python做一些有趣的东西)呢?

3 个回答

0

如果你在用Homebrew来管理软件,可能会想用 pip 来安装Python的包。pip 可以通过Homebrew来安装,不过Homebrew并不提供其他Python包的安装公式。不过,使用pip安装包其实很简单,就像下面这样:

$ pip install <package>

(你可以在PyPI上找到包的名字。)如果你是通过Homebrew安装的pip,那你就只需要这样做了。

6

我强烈建议使用以下工具。我用它们来进行基本的包管理。

以下是一些可以帮助你的教程和博客:

3

在我看来,处理Python包的最佳方式是使用一套与系统Python分开的Python安装,每个需要的版本都单独安装。

这样我就不会把旧版本的包弄到主Python里,而且我可以随意删除和重新安装这些包,不会影响我的项目。

具体来说:

在OS X上,使用Macports的版本是可以的。Homebrew也应该差不多,虽然我没用过。(在Linux上,我会把Python从源代码安装到/opt/pythonxx/,比如/opt/python25/、/opt/python26/、/opt/python27和/opt/python31。)

然后我从不在这些Python里安装任何包,除了virtualenvdistributepip,这三个我会在所有的Python版本里安装。当我想为一个项目安装包时,我会为这个项目创建一个虚拟环境,使用我为这个项目选择的Python版本:

$ cd /home/projects
$ /opt/python27/bin/virtualenv acoolproject
$ cd acoolproject
$ ./bin/pip install ThepackageIneed.

因为你为每个项目的依赖单独安装包,所以可以避免依赖问题、版本冲突和版本混淆。

你可以用virtualenv来启用和禁用环境,但我一般不这样做,我会明确使用Python可执行文件:

$ ./bin/python main.py

或者

$ /home7projects/acoolproject/bin/python

如果我需要一些不能仅用pip安装的东西,比如Plone、nginx或varnish,我会使用zc.buildout来创建一个可复制的环境配置,zc.buildout也会在隔离的环境中运行,所以不会在主Python里安装任何包。

撰写回答