如何维护长期存在的python项目w.r.t.依赖项和python版本?

时间:2010-05-03 16:41:14

标签: python installation dependencies multiple-versions

简短版本:如何摆脱多版本的python梦魇?

长版本:多年来,我使用了几个版本的python,更糟糕的是,几个扩展到python(例如pygame,pylab,wxPython ......)。每次使用不同的操作系统,使用不同的操作系统,有时候使用不同的体系结构(比如我的旧PowerPC mac)。

现在我正在使用mac(x86-64上的OSX 10.6),每次我想恢复早于几个月的脚本时,它都是一个依赖性的噩梦。 Python本身已经在/usr/bin(2.5,2.6,3.1)中有三种不同的风格,但我必须从macports安装2.4 for pygame,其他东西(不记得是什么)迫使我从macports安装所有其他三个好吧,所以在一天结束时,我是我系统上七个(!)python实例的幸福拥有者。

但这不是问题,问题是,它们都没有安装正确的(即同一组)库,其中一些是32位,大约64位,现在我几乎丢失了。

例如,现在我正在尝试运行一个三年前的脚本(不是我写的),它曾经使用matplotlib / numpy在wxwidgets窗口的矩形内绘制实时图。但我惨遭失败:来自macports的py26-wxpython将无法安装,库存python包含wxwidgets但在32位和64位之间也有一些冲突,并且它没有numpy ......真是一团糟!

显然,我做错了事。 如何应对所有混乱?

8 个答案:

答案 0 :(得分:10)

我使用virtualenv解决了这个问题。我同情希望避免进一步的噩梦抽象层次,但virtualenv实际上非常干净且易于使用。你真的这样做(命令行,Linux):

virtualenv my_env

默认情况下,这将创建一个新的python二进制文件和库位置,以及现有系统库的符号链接。然后,要切换路径以使用新环境,请执行以下操作:

source my_env/bin/activate

就是这样。现在,如果您安装模块(例如,使用easy_install),它们将安装到lib目录的my_env目录中。它们不会干扰现有的库,你不会得到奇怪的冲突,东西不会停止在你的旧环境中工作。他们是完全孤立的。

要退出环境,请执行

deactivate

如果您认为安装时出错,或者您不再需要该环境,请删除目录:

rm -rf my_env

你已经完成了。这真的很简单。

virtualenv很棒。 ;)

答案 1 :(得分:4)

看看virtualenv

答案 2 :(得分:4)

一些提示:

  • 在Mac OS X上,仅使用 /Library/Frameworks/Python.framework中的python安装。
  • 每当你使用numpy / scipy / matplotlib时,安装enthought python发行版
  • 使用virtualenv和virtualenvwrapper来保持那些“系统”装置的原始状态;理想情况下,每个项目使用一个虚拟环境,以满足每个项目的依赖关系。而且,是的,这意味着可能会在各种虚拟环境中复制大量代码。

这似乎确实是一个更大的混乱,但至少事情是这样的。基本上,如果其中一个项目在virtualenv中工作,无论你执行什么升级,它都会继续工作,因为你永远不会改变“系统”安装。

答案 3 :(得分:1)

我通常做的是尝试(逐步)跟上Python版本(并且一旦所有外部依赖项都有正确的版本可用)。

大多数情况下,Python代码本身可以按原样传输,只需要很少的修改。

我最大的Python项目@work(15.000+ LOC)现在已经在Python 2.6上运行了几个月(由于安装/检查10个以上的依赖项,从Python 2.5升级所有内容大部分都需要一天...)

总的来说,我认为这是自由软件堆栈中大多数相互依赖的组件的最佳策略(想想linux软件存储库中的依赖关系):保持你的版本(半) - 当前(或者至少:在同样的速度)。

答案 4 :(得分:1)

  • 安装您需要的python版本,如果来自
  • ,则更好
  • 编写脚本时,在其中包含完整的python版本(例如#!/usr/local/bin/python2.6

我看不出会出现什么问题。

如果有的话,无论如何都可能是macports的错,而不是你的(我不再使用macports的原因之一)。

我知道我可能会遗漏一些东西而且会被投票,但请在这种情况下留下至少一点评论,谢谢:)

答案 5 :(得分:0)

我将MacPorts版本用于所有内容,但正如您所注意到的那样,许多默认版本都是古怪的。例如,Snow Leopard中的vim omnicomplete将python25作为依赖项。许多与python相关的端口都有旧的依赖关系,但您通常可以在构建时标记较新的版本,例如port install vim +python26而不是port install vim +python。在安装任何东西之前做一个干运行,看你是否拉动,例如,当没有必要时整个python24。经常检查portfiles因为达尔文端口的命名约定已经离开地面,所以还有一些不足之处。在实践中,我只是将所有内容保留在MacPorts的默认/opt...文件夹中,包括整个框架的副本以及PyObjC的副本等,并且一次只保留一个版本,保留选项以返回到如果事情意外中断,系统默认。这可能有点太多工作要避免使用virtualenv,我一直想要使用它。

答案 6 :(得分:0)

我使用Buildout运气好。您可以设置一个列表,列出哪些鸡蛋以及您想要的版本。然后,Buildout会为您下载并安装每个版本的私有版本。它创建了一个私有的“python”二进制文件,已经安装了所有的鸡蛋。本地“nosetests”使事情易于调试。您可以使用自己的函数扩展构建。

在不利方面,Buildout可能非常神秘。做“buildout -vvvv”一段时间,看看它到底在做什么以及为什么。

http://www.buildout.org/docs/tutorial.html

答案 7 :(得分:0)

至少在Linux下,多个蟒蛇可以相当幸福地共存。我在CentOS系统上使用Python 2.6,它需要Python 2.4作为各种系统的默认设置。我只是将python 2.6编译并安装到一个单独的目录树中(并将相应的bin目录添加到我的路径中),这是相当轻松的。然后输入“python2.6”来调用它。

启动并运行单独的pythons后,为特定版本安装库非常简单。如果你使用你想要的python调用setup.py脚本,它将安装在适合该python的目录中,脚本将安装在与python可执行文件本身相同的目录中,并在调用时自动使用正确的python。 / p>

我也尽量避免使用太多的库。当我只需要一个库中的一个或两个函数(例如scipy)时,我经常会看到我是否可以将它们复制到我自己的项目中。