[英]managing a python package that depends on other packages
我无法想象这是一个原始问题,但是我似乎找不到答案。 我一定使用了错误的搜索词。
我们的团队正在开发Python实用程序包。 我们将其称为“工具”。 “工具”中的各种类需要其他软件包和模块。
“工具”有几个类,名称如下:
还有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文件使用点 还有其他常见的模式,使用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结合使用时。 有时每个团队甚至有多个需求文件,一个是实际使用的文件,另一个是用于开发和测试的文件等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.