初学者在OSX上使用Python包管理的常识性建议
如果我在OSX(Snow Leopard)上学习Python开发,我该如何更好地管理我的Python包呢?
我对市面上有那么多优秀的Python包感到非常兴奋。我想开始学习它们,但包管理让我完全困惑。显然,我对这方面一无所知。我在Stack Overflow上看到很多关于包管理的问题,很多人回答时常常说:“你为什么不直接用x呢?看看我从命令行复制过来的这一行是多么简单。”
$ x install something
这听起来是个不错的答案,但当x无法处理某些特定的依赖关系,或者无法处理包y时,就不那么好用了。以下是我已经尝试过的:
- 我最开始只是用easy_install来安装东西。
- 我很快发现一些重要的包缺少依赖(比如PIL),于是我四处寻找,发现了MacPorts。
- 我开始使用MacPorts,但我的环境变量变得非常混乱,所以我学了一些bash命令,重新配置了
PATH
、PYTHONPATH
和sys.path
,让一切正常工作(还让我的终端窗口看起来不错)。一开始MacPorts看起来很不错。 - 但后来我对不同模块的版本感到困惑,还发现了更多的依赖问题(比如GDAL)……
- 然后有几位非常聪明的人强烈建议我换用Homebrew。于是我卸载了MacPorts,安装了Homebrew。
- 现在我有了Homebrew,但似乎什么都装不了,因为我不知道如何为我想用的大多数Python包创建Formula。如果一个包在pypi上列出,我不知道我是否应该真的使用Homebrew,还是只需弄清楚如何配置easy_install以安装到Homebrew目录。而且我仍然不知道如何最好地处理缺失的依赖。也许有某个秘密的与Python相关的Formula库?或者有什么简单的方法可以将portfiles转换成Formula?
我知道正确的答案可能取决于我想安装的内容。我想安装一组包,让我可以:
- 用Python玩耍和自动化所有事情
- appscript
- PIL
- pygame
- 在Python中做与地理信息系统(GIS)相关的工作
- gdal
- shapely
- postgis
- scipy
- 探索网络应用的奇妙可能性
- django
- google-app-engine
我完全愿意把我机器上的一切都清除掉,因为现在可能已经堆满了各种包的残余。如果我应该学习virtualenv,或者只是多了解一下检查依赖和自己安装的基本过程,我都很乐意去做。如果我应该深入研究Homebrew,我也很乐意这样做。我该如何处理这些问题,这些问题常常阻止我做我真正想做的事情(用Python做一些有趣的东西)呢?
3 个回答
如果你在用Homebrew来管理软件,可能会想用 pip
来安装Python的包。pip
可以通过Homebrew来安装,不过Homebrew并不提供其他Python包的安装公式。不过,使用pip安装包其实很简单,就像下面这样:
$ pip install <package>
(你可以在PyPI上找到包的名字。)如果你是通过Homebrew安装的pip,那你就只需要这样做了。
我强烈建议使用以下工具。我用它们来进行基本的包管理。
- virtualenv: http://pypi.python.org/pypi/virtualenv(这个工具可以帮助你创建一个独立的环境,避免不同项目之间的包冲突)
- virtualenvwrapper: http://pypi.python.org/pypi/virtualenvwrapper(这个是virtualenv的一个扩展,提供了更方便的管理工具)
- yolk: http://pypi.python.org/pypi/yolk(这个工具可以帮助你查看已安装的包和它们的版本)
- pip: http://pypi.python.org/pypi/pip(这是一个非常常用的包管理工具,可以用来安装和管理Python包)
以下是一些可以帮助你的教程和博客:
- http://simononsoftware.com/virtualenv-tutorial/(这个教程讲解了如何使用virtualenv)
- http://paintincode.blogspot.com/2010/08/install-pip-virtualenv.html(这个博客介绍了如何安装pip和virtualenv)
在我看来,处理Python包的最佳方式是使用一套与系统Python分开的Python安装,每个需要的版本都单独安装。
这样我就不会把旧版本的包弄到主Python里,而且我可以随意删除和重新安装这些包,不会影响我的项目。具体来说:
在OS X上,使用Macports的版本是可以的。Homebrew也应该差不多,虽然我没用过。(在Linux上,我会把Python从源代码安装到/opt/pythonxx/,比如/opt/python25/、/opt/python26/、/opt/python27和/opt/python31。)
然后我从不在这些Python里安装任何包,除了virtualenv
、distribute
和pip
,这三个我会在所有的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里安装任何包。