如何在不加载模块的情况下获取模块信息?

2 投票
2 回答
741 浏览
提问于 2025-04-17 09:59

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

不过,我想在真正加载模块之前,先获取一些关于这个模块的信息(比如__version__)。

我该怎么做呢?我在imp里面没有找到什么有用的方法。

现在,我觉得最好的办法就是自己解析通过imp.find_module找到的文件。

2 个回答

4

你不能这样做。__version__ 只是一个名字,它代表了模块在运行时创建的一个对象。这个对象在你执行定义这个模块的文件之前是不存在的。解析代码是一种选择,但只有在定义 __version__ 的代码很简单的时候才有效,比如:

__version__ = 'some literal'

如果代码比较复杂,那你至少得执行部分代码才能获取这个值。

1

这要看你说的模块是什么,以及它是否已经安装等情况。比如你想要获取 __version__ 这个信息,但并不是每个模块都有这个属性。模块在被导入时,会自动生成一些标准属性,比如 __cached____doc____file____name____package__

如果模块还没有安装,比如你下载了一个 tgz 文件,它通常会有一个 setup.py 文件。你可以通过 distutils 来提取这个文件里的很多信息。我在 pyroma 中就是这么做的。

如果模块已经安装,它可能会有一个 EGG-INFO 目录。在这个目录里,你会找到很多文件,里面包含了很多信息。大部分信息都在 PKG-INFO 文件里。要想有这些信息,你的每个模块都必须使用 Distribute(或者 Setuptools)。

如果没有 EGG-INFO/PKG-INFO 文件,那你就得自己解析了。对于 __version__,你可以尝试用正则表达式来匹配。虽然这不是一个很通用的方法,但实际上你要找的信息也不会很通用,而且很可能只有在你确切知道要查看哪个模块时才会存在。

对于其他信息,你可能需要一个解析器。ast 可能是最好的选择,虽然 lib2to3 中的解析器也有它的优点。

撰写回答