管理依赖于其他包的python包

时间:2013-02-11 17:43:52

标签: python python-2.7

我无法想象这是一个原始问题,但我似乎无法找到答案。我必须使用错误的搜索字词。

我们的团队正在开发一个Python实用程序包。我们称之为“工具”。 “工具”中的各种类需要其他包和模块。

“tools”有几个类,名称如下:

  • 分析器
  • 记录器
  • FooTester
  • BarTester

还有2个其他套餐。一个叫做“foo”,另一个叫“bar”。有些团队只使用“foo”包,有些团队只使用“bar”包。要求仅使用“foo”包的团队不安装“bar”包。

“FooTester”类需要“foo”包,因为它中包含“import foo”。 “BarTester”类需要“bar”包,因为它有一个“导入栏”。

两个团队都希望将以下内容放在他们脚本的顶部:“导入工具”,然后使用他们各自的Tester类。

正如我们现在所做的那样,除非你安装了“bar”和“foo”软件包,否则你不能这样做。

这样做的标准方法是什么?有吗?

3 个答案:

答案 0 :(得分:0)

我认为FooTester将成为foo包的BarTester包和bar部分的一部分。 (或者也许每个都在自己的包/模块中。)

鉴于要求使用foo软件包的团队不安装bar软件包,将两者的测试人员放在两个使用的tools软件包中似乎很奇怪。

答案 1 :(得分:0)

"工具"可以有条件地定义它的类:

fooed = barred = False

try:
    import foo
    fooed = True
    class FooTester(object):
        pass # your class here...
except ImportError:
    pass

try:
    import bar
    barred = True
    class BarTester(object):
        pass # your class here...
except ImportError:
    pass

if not fooed or barred:
    raise RuntimeError("You are not fooed or barred")

答案 2 :(得分:0)

解决方案很少

选项全部:安装所有内容,忽略您的特殊要求

这不能解答您的问题,但可能是最有效的解决方案。除非您有一些因任何原因难以安装的软件包,否则不值得为不同的团队分离安装。如果你计算实现它所需的时间,你会发现,这是不可行的。如果您需要安装软件包所需的时间,请参阅related SO answer for pip configuration将安装速度降低到一秒或两秒,即使对于需要编译的软件包也是如此。

选项多:将解决方案组织到多个多级包中

您可以将解决方案拆分为

等软件包
  • tool.common
  • tool.teamA
  • tool.teamB
  • tool.teamB

在这种情况下,工具称为命名空间包,并且应为空。

任何软件包都可能需要安装其他软件包,通常tool.common可能是所有其他软件包中必需软件包的一部分。

选项点:将pip与requirements.txt个文件

一起使用

还有其他常见模式,使用piprequirements.txt文件。

pip允许安装在某些文本文件中声明的文件,通常称为reuirements.txt,但任何其他名称都可以。

而不是使用:

$ pip install tool.teamA

人们会以某种方式获取代码,例如由:

$ git clone repo4tools

在该存储库中,会有文件

  • requirements-teamA.txt
  • requirements-teamB.txt
  • requirements-teamC.txt

以及其他任何需要的东西。

每个需求文件仅包含给定团队所需的包。

然后人们会打电话:

$ cd repo4tools
$ pip install -r requirements-teamA.txt

对于开发者来说,最后一个选项变得非常流行,特别是与virtualenv结合使用。有时每个团队甚至有多个需求文件,一个用于实际使用,另一个用于开发和测试等。