【问题标题】:How to get module information without loading it?如何在不加载的情况下获取模块信息?
【发布时间】:2012-01-11 11:02:51
【问题描述】:

我知道imp 模块可以在 Python 3 中用于加载模块和包。

但是,我想在实际加载模块之前获取一些关于模块的信息(例如 __version__)。

我怎样才能得到这些信息?我在imp 中没有找到任何有用的方法。

现在,我无法比自己解析imp.find_module 找到的文件更好。

【问题讨论】:

  • 导入模块,检查版本,如果发现是错误的,如何从sys.modules再次删除?如果由于某种原因这不是一个选项,那么使用 ast 模块解析文件肯定比自己解析更好。
  • 你为什么要这个?改变答案的原因。
  • 我正在构建一个插件管理器,其中有一个 AddonManager 显示加载/可用的插件(就像在现代浏览器中一样)。每个插件都必须实现__version____desc__,我想为“可用但未加载的插件”显示这些值。
  • @rds:然后我建议模块必须使用 Distribute,并使用 pip 安装。在这种情况下,您可以解析包 EGG-INFO 目录(请参阅答案)。

标签: python python-3.x


【解决方案1】:

你不能。 __version__ 只是模块在执行时创建的对象的名称。在您执行负责定义模块的文件之前,它不存在。解析是一种选择,但只有在定义 __version__ 的代码很简单时才会起作用,例如

__version__ = 'some literal'

如果涉及更多内容,那么您必须至少部分执行代码。

【讨论】:

    【解决方案2】:

    这取决于模块是什么,是否已安装等。例如,您想要__version__,但模块中不能保证存在任何内容。您在模块上拥有的标准属性,例如 __cached____doc____file____name____package__ 都是在导入时创建的。

    如果该模块尚未安装,即它是一个下载的 tgz 或其他东西,它可能会有一个 setup.py 文件,然后如果你使用distutils 提取它,你可以从该发行版中获得很多信息。例如,我在pyroma 中执行此操作。

    如果已安装,它可能有一个 EGG-INFO 目录。在那里你会找到一堆文件,里面有很多信息。其中大部分位于 PKG-INFO 文件中。为此,您的每个模块都必须使用 Distribute(或 Setuptools)。

    如果它没有 EGG-INFO/PKG-INFO 文件,那么你将不得不解析它。对于__version__,您可能只需进行正则表达式匹配即可。这不是很通用,但话又说回来,您要查找的任何信息都不是通用的,除非您确切知道正在查看的模块,否则很可能不存在。

    对于其他事情,您可能需要解析器。 ast 可能是那里的最佳选择,尽管 lib2to3 中的解析器也有它的优点。

    【讨论】:

    • egg-info 似乎是个好主意。我将如何列出候选模块?我最初的想法是将模块部署在我的应用程序的子目录中,在这种情况下,一个简单的dir.list() 会生成列表。
    猜你喜欢
    • 2020-11-02
    • 2012-10-24
    • 2016-05-15
    • 2012-03-09
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多