管理依赖于其他包的python包

2024-10-01 00:18:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我无法想象这是一个原创的问题,但我似乎找不到答案。我一定是用错搜索词了。你知道吗

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

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

  • 分析器
  • 记录器
  • 脚酯
  • 酒保

还有另外两个包裹。一个叫“foo”,另一个叫“bar”。有些团队只使用“foo”包,有些团队只使用“bar”包。要求只使用“foo”包的团队不要安装“bar”包。你知道吗

“FooTester”类需要“foo”包,因为其中包含“import foo”。 “BarTester”类需要“bar”包,因为其中包含“import bar”。你知道吗

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

因为我们现在有它,你不能这样做,除非你有“酒吧”和“foo”包安装。你知道吗

做这件事的标准方法是什么?有?你知道吗


Tags: 模块工具答案import实用程序名称分析器foo
3条回答

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

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

我认为FooTesterfoo包的一部分,而BarTesterbar包的一部分。(或者每个都在自己的包/模块中。)

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

几乎没有解决办法

选项所有:安装一切,忽略您的特殊要求

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

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

您可以将解决方案拆分为如下包

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

在这种情况下,工具称为名称空间包,应该为空。你知道吗

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

选项Pip:对requirements.txt文件使用Pip

还有其他常见的模式,使用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结合使用时。有时甚至每个团队都有多个需求文件,一个用于实际使用,另一个用于开发和测试等

相关问题 更多 >