我知道可以在Python 3中使用imp
模块来加载模块和包。
但是,在我实际加载模块之前,我想获得一些模块的信息(比如__version__
)。
如何获取此信息?我在imp
中找不到任何有用的方法。
现在,我看不出比imp.find_module
找到的文件更好。
答案 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
中的解析器也有好的方面。