我需要列出所有导入的模块及其版本。我的一些代码只适用于特定版本,我想保存软件包的版本,以便将来再查一次。 列出包的名称:
modules = list(set(sys.modules) & set(globals()))
print modules
但是,如果我现在想要获取列表项的版本,则它不起作用:
for module in modules:
print module.__version__
有没有办法用字符串来解决.__version__
命令,还是让我采用另一种方式来获取名称和版本?
在其他问题中,仅解决了模块的名称:How to list imported modules?
答案 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模块本身。