在同一个过程中使用不同版本的python库

问题描述:

我们有一个我们正在开发的python库。在开发过程中,我想使用该库的某些部分来测试它的较新版本。也就是说,使用稳定的代码来测试开发代码。有什么办法在Python中做到这一点?在同一个过程中使用不同版本的python库

编辑:更具体地说,我们有一个库(LibA),它有很多有用的东西。另外,我们有一个使用LibA的测试库来提供一些测试工具(LibT)。我们想要使用LibT来测试LibA,但是因为LibT依赖于LibA,所以我们宁愿它在测试LibT时使用稳定版本的LibA(因为我们只会在测试通过时才更改LibT以使用更新的LibA)。因此,在运行单元测试时,LibA-dev测试将使用依赖于LibA-stable的LibT代码。

我们想到的一个想法是在不同的进程上使用RPyC调用稳定的代码,但是要以一种不透明的方式实现它很棘手(确保它正确地死掉等等,并允许多个实例在同一台计算机上的同一时间等)。

感谢

+1

为什么不能使用普通的源代码管理工具来构建稳定和开发代码的所需配置?其他人都在SVN中使用分支。并没有编程。为什么你不能使用SVN分支来做到这一点? – 2009-10-19 10:21:41

+1

看不到分支与此有关,所以我提出了一个更清晰的问题,希望它能帮助你理解我正在尝试做的事情。 – abyx 2009-10-19 11:09:22

我不确定你到底需要如何设置你的测试,但你可以使用VirtualEnv靠上海誓山盟运行的两个实例。

+0

这不是一方,实际上需要使用另一方。 – abyx 2009-10-19 11:04:23

如果您使用依赖于libA(稳定)的libT来“测试”libA-dev,那么您并不真正在测试libA-dev,因为它会在生产环境中运行。真正测试libA-dev的唯一方法就是全力以赴,并使libT依赖于libA-dev。如果这打破了你的单元测试,那么这是一件好事 - 它向你展示了需要修复的东西。

如果你没有单元测试,那么这是开始制作它们的时候了(首先使用稳定的libA和libT!)。

我推荐使用“版本控制系统”(例如bzr,hg,svn,git)。然后你可以制作你的项目的分支,“stable”和“devA”。

要在分支DEVA工作,你会首先运行

export PYTHONPATH=/path/to/devA 

通过确保PYTHONPATH环境变量不包括其他部门,你放心Python是只使用你想要的模块。

当需要从dev - > stable合并代码时,版本控制软件将提供一个简单的方法来实现。

版本控制还可以让你变得更大胆 - 尝试重大更改并不是可怕的。如果事情没有解决,恢复是非常容易的。在这和PYTHONPATH技巧之间,你总是能够回到已知的工作代码。

如果您觉得上述只是不适合您,并且您必须使用libT-which-depends-on-libA来测试libA-dev,那么您需要重命名所有模块并修改所有的import语句在libA-dev和libA之间做了明确的分离。例如,如果libA有一个名为moduleA.py的模块,则将其重命名为moduleA_dev.py。

命令

rename -n 's/^(.*)\.py/$1_dev.py/' *.py 

将 “_dev” 添加到所有的* .py文件。 (使用“-n”标志,重命名命令只会显示你想要的重命名,删除“-n”以实际完成它。)

要恢复的重命名,运行

rename -n 's/^(.*)_dev\.py/$1.py/' *.py 

下一步,你需要将所有的引用moduleA到moduleA_dev代码中。命令

find /path/to/LibA-dev/ -type f -name '*.py' -exec sed -i 's/moduleA/moduleA_dev/g' {} \; 

将改变LibA-dev中的每个* .py文件,改变“moduleA” - >“moduleA_dev”。

请小心使用此命令。这很危险,因为如果你有一个叫做moduleAB的变量,那么它将被重命名为moduleA_devB,而你真正想要的可能是moduleAB_dev。

为了一旦分离的命名空间还原此变化(受上述警告),

find /path/to/LibA-dev/ -type f -name '*.py' -exec sed -i 's/moduleA_dev/moduleA/g' {} \; 

,你已经打破的循环依赖关系。一旦你满意你的libA-dev是好的,你可以改变moduleA_dev.py - > moduleA.py并且 在代码中改变对moduleA_dev - > moduleA的所有引用。

+0

但是他们是不同的项目,LibAT有什么意义? LibT想要使用稳定版本的LibA,就是这样。我从来不想在其他代码中使用LibT的开发版本,只有稳定的LibT和稳定的LibA才能测试dev-LibA – abyx 2009-10-19 12:38:07

+0

我已经编辑了我的答案,希望能更好地解决您的情况。 – unutbu 2009-10-19 16:36:23

“我们想用LIBT测试力霸,但由于LIBT取决于力霸,我们宁愿它使用力霸的稳定版本,在测试LIBT”

这是没有意义的,使用T + A来测试A.有意义的是以下内容。

LibA真的是两件东西混合在一起:A1和A2。

T取决于A1。

实际情况是,您使用T和A1来升级和测试A2。

如果将LibA分解为T需要的部分和其他部分,则可能能够打破此循环依赖关系。