如何列出导入的模块及其版本?

时间:2016-07-08 13:21:42

标签: python

我需要列出所有导入的模块及其版本。我的一些代码只适用于特定版本,我想保存软件包的版本,以便将来再查一次。 列出包的名称:

modules = list(set(sys.modules) & set(globals()))
print modules

但是,如果我现在想要获取列表项的版本,则它不起作用:

for module in modules:
    print module.__version__

有没有办法用字符串来解决.__version__命令,还是让我采用另一种方式来获取名称和版本? 在其他问题中,仅解决了模块的名称:How to list imported modules?

2 个答案:

答案 0 :(得分:5)

因为您有模块名称的字符串列表,而不是模块本身。试试这个:

for module_name in modules:
    module = sys.modules[module_name]
    print module_name, getattr(module, '__version__', 'unknown')

请注意,并非所有模块都遵循在__version__中存储版本信息的惯例。

答案 1 :(得分:3)

我对大型遗留程序的一个问题是使用了别名(import thing as stuff)。确切地知道正在加载哪个文件通常也很好。我刚刚写了这个模块,可能会做你需要的:

spection.py

"""
Python 2 version
10.1.14
"""
import inspect
import sys
import re

def look():

    for name, val in sys._getframe(1).f_locals.items():
        if inspect.ismodule(val):

            fullnm = str(val)

            if not '(built-in)' in fullnm and \
               not __name__     in fullnm:
                m = re.search(r"'(.+)'.*'(.+)'", fullnm)
                module,path = m.groups()
                print "%-12s maps to %s" % (name, path)
                if hasattr(val, '__version__'):
                    print "version:", val.__version__

使用它:

import sys
import matplotlib
import spection

spection.look()

给(在我的系统上):

matplotlib   maps to /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/matplotlib/__init__.pyc
version: 1.3.1

你会注意到我省略了像sys这样的内置函数和spetion模块本身。