我知道imp
模块可以在Python 3中使用来加载模块和包。如何在不加载模块信息的情况下获取?
但是,在我实际加载它之前,我想了解一些有关模块的信息(如__version__
)。
我怎样才能得到这些信息? imp
我没有找到任何有用的方法。
现在,我看不到比自己解析imp.find_module
找到的文件更好。
我知道imp
模块可以在Python 3中使用来加载模块和包。如何在不加载模块信息的情况下获取?
但是,在我实际加载它之前,我想了解一些有关模块的信息(如__version__
)。
我怎样才能得到这些信息? imp
我没有找到任何有用的方法。
现在,我看不到比自己解析imp.find_module
找到的文件更好。
这取决于模块是什么,以及它是否安装等。例如,您想要__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()'产生列表。 – rds 2012-02-06 15:10:31
@rds:这绝对是一个很好的做法。 – 2012-02-06 19:48:12
你不能。 __version__
只是模块在执行时创建的对象的名称。在您执行负责定义模块的文件之前,它不存在。解析是一种选择,但它只有在定义__version__
的代码是微不足道的情况下才起作用,例如,
__version__ = 'some literal'
如果涉及更多内容,则必须至少部分执行代码。
如果导入模块,检查版本,如果结果是错误的,从'sys.modules'中删除它又如何?如果这是由于某种原因而不是选项,那么使用'ast'模块解析文件肯定比自己解析文件更好。 – 2012-01-11 11:06:01
你为什么要这样?之所以改变答案。 – 2012-01-11 13:44:59
我正在构建一个插件管理器,其中有一个显示已加载/可用插件的AddonManager(就像在现代浏览器中一样)。每个插件都必须实现'__version__'和'__desc__',我想为“可用但未加载的插件”显示这些值。 – rds 2012-01-11 13:50:54