如何获取模块信息而不加载它?

时间:2012-01-11 11:02:52

标签: python python-3.x

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

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

如何获取此信息?我在imp中找不到任何有用的方法。

现在,我看不出比imp.find_module找到的文件更好。

2 个答案:

答案 0 :(得分:4)

你做不到。 __version__只是模块在执行时创建的对象的名称。在执行负责定义模块的文件之前,它不存在。解析是一种选择,但只有在定义__version__的代码是微不足道的情况下才会起作用,例如。

__version__ = 'some literal'

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

答案 1 :(得分:1)

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

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

如果安装它,它可能有一个EGG-INFO目录。在那里,你会发现一堆文件,包含大量信息。其中大部分都在PKG-INFO文件中。为此,您的每个模块都必须使用Distribute(或Setuptools)。

如果它没有EGG-INFO / PKG-INFO文件,那么你将不得不解析它。对于distutils,您可以只进行正则表达式匹配。这不是很通用,但是,无论你寻找什么信息都不是通用的,除非你确切知道你正在看什么模块,否则很可能不会存在。

对于其他事情,您可能需要一个解析器。 __version__可能是最好的选择,尽管ast中的解析器也有好的方面。