繁体   English   中英

管理依赖于其他软件包的python软件包

[英]managing a python package that depends on other packages

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

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

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

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

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

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

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

正如我们现在所拥有的,除非您安装了“ bar”和“ foo”软件包,否则您将无法执行此操作。

这样做的标准方法是什么? 在那儿?

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

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

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

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

解决方案很少

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

这不能回答您的问题,但可能是最有效的解决方案。 除非您有一些由于任何原因而难以安装的软件包,否则不值得为不同的团队而分开安装它们。 如果您算出实现此目标所需的时间,那将是不可行的。 如果您担心安装软件包所需的时间,请参见相关的SO答案,以进行pip配置 ,从而将安装速度降低到一到两秒,甚至对于需要编译的软件包也是如此。

多选件:将解决方案组织成多个多层包

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

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

在这种情况下,工具就是所谓的名称空间包,并且应为空。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM