2012-01-11 124 views
2

我知道imp模块可以在Python 3中使用来加载模块和包。如何在不加载模块信息的情况下获取?

但是,在我实际加载它之前,我想了解一些有关模块的信息(如__version__)。

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

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

+0

如果导入模块,检查版本,如果结果是错误的,从'sys.modules'中删除它又如何?如果这是由于某种原因而不是选项,那么使用'ast'模块解析文件肯定比自己解析文件更好。 – 2012-01-11 11:06:01

+0

你为什么要这样?之所以改变答案。 – 2012-01-11 13:44:59

+0

我正在构建一个插件管理器,其中有一个显示已加载/可用插件的AddonManager(就像在现代浏览器中一样)。每个插件都必须实现'__version__'和'__desc__',我想为“可用但未加载的插件”显示这些值。 – rds 2012-01-11 13:50:54

回答

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中的解析器也有好的一面。

+0

egg-info似乎是个好主意。我将如何能够列出候选人模块?我最初的想法是将模块部署到我的应用程序的子目录中,在这种情况下,一个简单的'dir.list()'产生列表。 – rds 2012-02-06 15:10:31

+0

@rds:这绝对是一个很好的做法。 – 2012-02-06 19:48:12

4

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

__version__ = 'some literal' 

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

相关问题