10

简短版:如何摆脱 Python 的多版本噩梦?

长版本:多年来,我使用了多个版本的 python,更糟糕的是,还使用了几个 python扩展(例如 pygame、pylab、wxPython...)。每次它在不同的设置上,使用不同的操作系统,有时是不同的架构(比如我的旧 PowerPC mac)。

现在我使用的是 Mac(x86-64 上的 OSX 10.6),每次我想恢复几个月前的脚本时,它都是一个依赖的噩梦。Python 本身已经在 (2.5, 2.6, 3.1) 中提供了三种不同的版本/usr/bin,但是我必须从 macports 为 pygame 安装 2.4,其他东西(不记得是什么)迫使我也从 macports 安装了所有其他三个版本,所以在一天结束时,我是我系统上七个(!)python 实例的快乐所有者。

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

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

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

4

8 回答 8

10

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

virtualenv my_env

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

source my_env/bin/activate

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

要退出环境,只需执行

deactivate

如果您决定安装错误,或者您不再需要该环境,只需删除目录:

rm -rf my_env

你完成了。真的就是这么简单。

virtualenv是很棒的。;)

于 2010-05-03T17:11:04.993 回答
4

看看virtualenv

于 2010-05-03T16:43:22.027 回答
4

一些技巧:

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

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

于 2010-05-03T17:12:28.247 回答
1

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

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

我最大的 Python 项目@work(15.000+ LOC)现在在 Python 2.6 上几个月了(由于安装/检查 10+ 依赖项,从 Python 2.5 升级所有东西确实需要一天的大部分时间......)

总的来说,我认为这是自由软件堆栈中大多数相互依赖的组件的最佳策略(想想 linux 软件存储库中的依赖项):保持你的版本(半)最新(或至少:以相同的速度进步) .

于 2010-05-03T16:56:22.803 回答
1
  • 安装你需要的python版本,如果从源代码更好
  • 编写脚本时,将完整的 python 版本包含在其中(例如#!/usr/local/bin/python2.6

我看不出会出什么问题。

如果有什么问题,那可能是 macports 的问题,而不是你的问题(我不再使用 macports 的原因之一)。

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

于 2010-05-16T15:06:48.257 回答
0

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

于 2010-05-03T17:14:09.217 回答
0

我在使用 Buildout 时很幸运。您设置了您想要哪些鸡蛋和哪些版本的列表。Buildout 然后为您下载并安装每个的私有版本。它制作了一个私有的“python”二进制文件,所有的鸡蛋都已经安装了。本地“nosetests”使调试变得容易。您可以使用自己的功能扩展构建。

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

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

于 2010-05-14T16:58:17.397 回答
0

至少在 Linux 下,多条 python 可以相当愉快地共存。我在 CentOS 系统上使用 Python 2.6,该系统需要 Python 2.4 作为各种系统事物的默认值。我只是简单地将 python 2.6 编译并安装到一个单独的目录树中(并将适当的 bin 目录添加到我的路径中),这相当轻松。然后通过键入“python2.6”来调用它。

一旦您启动并运行了单独的 python,安装特定版本的库就很简单了。如果您使用所需的 python 调用 setup.py 脚本,它将安装在适合该 python 的目录中,并且脚本将安装在与 python 可执行文件本身相同的目录中,并且在调用时将自动使用正确的 python。

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

于 2010-05-18T00:25:34.570 回答