【问题标题】:managing a python package that depends on other packages管理依赖于其他包的python包
【发布时间】:2013-01-26 21:15:18
【问题描述】:

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

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

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

  • 解析器
  • 记录器
  • FooTester
  • BarTester

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

“FooTester”类需要“foo”包,因为它有一个“import foo”。 “BarTester”类需要“bar”包,因为它有一个“import bar”。

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

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

执行此操作的标准方法是什么?有吗?

【问题讨论】:

  • 您是否可以选择重新设计tools?在我看来,tools 应该是一个包,每个类都是一个单独的模块。

标签: python python-2.7


【解决方案1】:

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

考虑到使用foo 包的团队不安装bar 包的要求,将两者的测试人员放在两者都使用的tools 包中似乎很奇怪。

【讨论】:

    【解决方案2】:

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

    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")
    

    【讨论】:

      【解决方案3】:

      解决办法很少

      Option All:安装一切,忽略您的特殊要求

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

      Option Multi:将解决方案组织成多个多级包

      您可以将解决方案拆分成包,如

      • tool.common
      • tool.teamA
      • tool.teamB
      • tool.teamB

      工具在这种情况下是所谓的命名空间包,应该是空的。

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

      选项 pip:将 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 结合使用。有时每个团队甚至会有多个需求文件,一个用于实际使用,另一个用于开发和测试等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-27
        • 2016-03-13
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-10
        • 2017-12-24
        相关资源
        最近更新 更多