简短版本:如何摆脱多版本的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 ......真是一团糟!
显然,我做错了事。 你如何应对所有混乱?
答案 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)
一些提示:
/Library/Frameworks/Python.framework
中的python安装。这似乎确实是一个更大的混乱,但至少事情是这样的。基本上,如果其中一个项目在virtualenv中工作,无论你执行什么升级,它都会继续工作,因为你永远不会改变“系统”安装。
答案 3 :(得分:1)
我通常做的是尝试(逐步)跟上Python版本(并且一旦所有外部依赖项都有正确的版本可用)。
大多数情况下,Python代码本身可以按原样传输,只需要很少的修改。
我最大的Python项目@work(15.000+ LOC)现在已经在Python 2.6上运行了几个月(由于安装/检查10个以上的依赖项,从Python 2.5升级所有内容大部分都需要一天...)
总的来说,我认为这是自由软件堆栈中大多数相互依赖的组件的最佳策略(想想linux软件存储库中的依赖关系):保持你的版本(半) - 当前(或者至少:在同样的速度)。
答案 4 :(得分:1)
#!/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”一段时间,看看它到底在做什么以及为什么。
答案 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)时,我经常会看到我是否可以将它们复制到我自己的项目中。