python:如何在运行时检查额外的需求?

时间:2013-04-10 14:03:59

标签: python pkg-resources

我们的主应用程序具有一些用户可以启用的额外功能。这些功能在他们自己的目录中。这些功能可能需要额外的依赖项。我正在考虑将那些放在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

这是正确的,pythonic的做事方式吗?这有意义吗?

小更新: 为什么如此复杂,而不仅仅是try: import ... except ImportError: ...在一个答案中建议:

  1. 我们的插件可能有很多依赖项。创建如下所示的实际代码非常详细。
  2. 某些插件可能需要特定版本的软件包。无论如何,测试需要使用pakcage特定测试或使用pkg_resources。所以这就是我上面的想法使用pkg_resources。
  3. 的原因
  4. 我们想对可以运行的插件运行单元测试。在单元测试中处理ImportError并不好。拥有can_we_unit_test_this_plugin(plugin)功能可以让事情变得更轻松。
  5. 第二次更新:extra_require中的setup.py呢?

    1. 人们经常错过安装这些。好的,不好的借口。
    2. 我的愿景是,setup.py直接从上面提到的extra_require加载requires.txt个别子目录中的{{1}}。但这真的是下一步。

1 个答案:

答案 0 :(得分:4)

通常,您只是尝试导入依赖项,并优雅地处理ImportError异常:

try:
    import dependency
except ImportError:
    # dependency missing, issue a warning
    import warnings
    warnings.warn('dependency not found, please install to enable xyz feature')

您可以在基于setuptools的extras_require脚本的setup.py条目中列出此类依赖项。 pipeasy_installzc.buildout都可以处理安装此类附加内容。请参阅Declaring “Extras” (optional features with their own dependencies)

如果您有这些条目,可以使用extras_require条目列出最低版本要求。是的,用户可能已经安装了较旧版本的依赖项;我只是清楚地记录要求。真的,测试功能,而不是版本。如果您需要更新的版本,因为添加了某种API方法?测试该方法而不是版本。

但是,听起来好像您可能希望将插件打包为单独的包,然后在extras_require中列出那些。我使用entry points来注册和枚举这样的插件。这样你需要测试包的导入,你只需枚举已注册的入口点。每个插件都列出了自己的依赖项,并拥有自己的单元测试。