代码之家  ›  专栏  ›  技术社区  ›  abyx

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

  •  5
  • abyx  · 技术社区  · 15 年前

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

    我们提出的一个想法是在不同的进程上使用RPyC调用稳定的代码,但是很难以不透风的方式实现(确保它正确终止等,并允许多个实例在同一台计算机上同时执行等)。

    谢谢

    3 回复  |  直到 15 年前
        1
  •  1
  •   S.Lott    15 年前

    “我们想用LibT测试LibA,但由于LibT依赖于LibA,所以我们希望它在测试LibT时使用稳定版本的LibA。”

    用t+A来测试A是没有意义的。有意义的是下面这些。

    LibA实际上是两个混合在一起的东西:A1和A2。

    T取决于A1。

    如果您将LibA分解成T需要的部分和其他部分,那么您就可以打破这种循环依赖。

        2
  •  1
  •   unutbu    15 年前

    如果您使用依赖于libA(稳定的)的libT“测试”libA dev,那么您实际上并没有像在生产环境中那样测试libA dev。真正测试libA dev的唯一方法是全力以赴,使libT依赖于libA-dev。如果这破坏了您的单元测试,那么这是一件好事——它向您展示了需要修复的地方。

    如果没有单元测试,那么现在就开始进行测试(首先使用稳定的libA和libT!).

    我建议使用“版本控制系统”(例如bzr、hg、svn、git)。然后你可以把你的项目分为“稳定”和“德瓦”。

    export PYTHONPATH=/path/to/devA
    

    通过确保PYTHONPATH环境变量排除其他分支,可以确保Python只使用所需的模块。

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

    指挥部

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

    要还原重命名,请运行

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

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

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

    要恢复此更改(以上述警告为准),

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

    更改代码中对moduleA_dev-->moduleA的所有引用。

        3
  •  0
  •   Alex Sexton    15 年前

    我不确定您需要如何设置测试,但是您可以使用 VirtualEnv