如何维护长期Python项目的依赖和Python版本?

10 投票
8 回答
769 浏览
提问于 2025-04-15 22:18

简短版:我该如何摆脱多个版本的Python带来的困扰?

详细版:这些年来,我用过好几个版本的Python,更糟糕的是,我还用过好几个Python的扩展(比如pygame、pylab、wxPython等)。每次使用的环境都不一样,有不同的操作系统,有时候还用不同的架构(比如我以前的PowerPC Mac)。

现在我在用一台Mac(OSX 10.6,x86-64),每次想要运行几个月前的脚本时,都会遇到依赖问题。Python本身在/usr/bin里就有三个不同的版本(2.5、2.6、3.1),但为了pygame,我还得从macports安装2.4,另外还有些东西(我记不清是什么)让我不得不从macports安装其他三个版本,结果我现在的系统里竟然有七个Python实例!

但这不是问题,问题是,它们都没有安装相同的库,有的还是32位,有的是64位,现在我真的是搞不清楚状况了。

比如,现在我想运行一个三年前的脚本(不是我写的),这个脚本以前用matplotlib和numpy在wxwidgets窗口的一个矩形内绘制实时图表。但我失败得很惨:macports里的py26-wxpython安装不了,系统自带的Python虽然有wxwidgets,但在32位和64位之间有冲突,而且没有numpy……真是一团糟!

显然,我的做法是错的。你们通常是怎么应对这种混乱的呢?

8 个回答

4

看看这个 virtualenv

10

我用 virtualenv 来解决这个问题。我理解大家想避免更复杂的抽象层,但其实 virtualenv 非常简单易用。你只需要在命令行(Linux系统)输入以下命令:

virtualenv my_env

这条命令会创建一个新的Python二进制文件和库的位置,并默认链接到你现有的系统库。然后,要切换到新的环境,你只需输入:

source my_env/bin/activate

就这样。现在,如果你安装模块(比如用 easy_install),它们会被安装到 my_env 目录下的 lib 文件夹里。这样就不会和你现有的库发生冲突,你的旧环境也不会出现奇怪的问题,所有东西都是完全隔离的。

要退出这个环境,只需输入:

deactivate

如果你觉得安装有问题,或者不想要这个环境了,只需删除这个目录:

rm -rf my_env

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

virtualenv 非常棒。 ;)

4

一些小建议:

  • 在Mac OS X上,使用位于 /Library/Frameworks/Python.framework 的Python安装。
  • 每次使用numpy、scipy或matplotlib时,建议安装Enthought Python发行版。
  • 使用virtualenv和virtualenvwrapper来保持“系统”安装的干净;理想情况下,每个项目使用一个虚拟环境,这样每个项目所需的依赖都能满足。是的,这意味着在不同的虚拟环境中可能会有很多代码重复。

这看起来确实有点麻烦,但至少这样做是有效的。基本上,如果某个项目在虚拟环境中能正常工作,那么无论你进行什么升级,它都能继续正常工作,因为你从来没有改变“系统”安装的内容。

撰写回答