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

Gyo*_*yom 10 python installation dependencies multiple-versions

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

长版本:多年来,我已经使用了几个版本的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 ......真是一团糟!

显然,我做错了事.如何 usally与所有的混乱应对?

ire*_*ses 10

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

virtualenv my_env
Run Code Online (Sandbox Code Playgroud)

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

source my_env/bin/activate
Run Code Online (Sandbox Code Playgroud)

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

要退出环境,就这样做

deactivate
Run Code Online (Sandbox Code Playgroud)

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

rm -rf my_env
Run Code Online (Sandbox Code Playgroud)

而且你已经完成了.这真的很简单.

virtualenv是很棒的.;)


Oli*_*ier 4

一些技巧:

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

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