我无法想象这是一个原始问题,但我似乎无法找到答案。我必须使用错误的搜索字词。
我们的团队正在开发一个Python实用程序包。我们称之为“工具”。 “工具”中的各种类需要其他包和模块。
“tools”有几个类,名称如下:
还有2个其他套餐。一个叫做“foo”,另一个叫“bar”。有些团队只使用“foo”包,有些团队只使用“bar”包。要求仅使用“foo”包的团队不安装“bar”包。
“FooTester”类需要“foo”包,因为它中包含“import foo”。 “BarTester”类需要“bar”包,因为它有一个“导入栏”。
两个团队都希望将以下内容放在他们脚本的顶部:“导入工具”,然后使用他们各自的Tester类。
正如我们现在所做的那样,除非你安装了“bar”和“foo”软件包,否则你不能这样做。
这样做的标准方法是什么?有吗?
答案 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
可能是所有其他软件包中必需软件包的一部分。
requirements.txt
个文件还有其他常见模式,使用pip
和requirements.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结合使用。有时每个团队甚至有多个需求文件,一个用于实际使用,另一个用于开发和测试等。