我们的主应用程序有一些额外的功能,用户可以启用。这些功能在他们自己的目录中。这些功能可能需要额外的依赖。我正在考虑将它们放在一个requires.txt
文件中。在运行时,我们想让人们知道该功能是否会中断。我目前正在考虑这样的事情:
def checkfeature(feature):
everything_okay = True
f = pkg_resources.resource_stream(feature, "requires.txt")
with f:
for r in pkg_resources.parse_requirements(f):
if pkg_resources.working_set.find(r) is None:
print "%r not found, please install, otherwise this feature does not work" % (r,)
everything_okay = False
return everything_okay
这是正确的、蟒蛇式的做事方式吗?这有意义吗?
小更新:为什么如此复杂,而不是try: import ... except ImportError: ...
像一个答案中建议的那样:
- 我们的插件可能有很多依赖项。创建如下所示的实际代码非常冗长。
- 某些插件可能需要特定版本的包。需要包装特定测试或
pkg_resources
无论如何都要使用的测试。所以这就是我上面的想法使用 pkg_resources 的原因。 - 我们想为可以运行的插件运行单元测试。在单元测试中处理 ImportError 并不好。拥有一个
can_we_unit_test_this_plugin(plugin)
函数会让事情变得更容易。
第二次更新:extra_require
insetup.py
呢?
- 人们经常想念安装那些。好吧,不好的借口。
- 我的愿景是,从上面提到的各个子目录中为各个功能
setup.py
加载直接。但这确实是下一步。extra_require
requires.txt