2016-07-08 6 views
1

Мне нужно перечислить все импортированные модули вместе с их версией. Некоторые из моих кодов работают только с определенными версиями, и я хочу сохранить версию пакетов, чтобы я мог снова просмотреть ее в будущем. Перечисляя имена пакетов работ:Как перечислить импортированные модули с их версией?

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

Но если теперь я хочу, чтобы получить версию элементов списка не работает с:

for module in modules: 
    print module.__version__ 

Есть ли способ решить .__version__ команда со строкой, или мне нужно пойти другим способом, чтобы получить имя и версию? В других вопросах учитываются только имена модулей: How to list imported modules?

+0

Это потому, что вы сохраняете только модули * имя * в этом списке 'modules'. В любом случае: обратите внимание, что атрибут '__version__' - это просто соглашение. У многих модулей этого нет. – Bakuriu

ответ

4

Поскольку у вас есть список строк имени модуля, а не самого модуля. Попробуйте это:

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

Обратите внимание, что не все модули следовать конвенции хранения информации о версии в __version__.

2

Одна из проблем, которые у меня были с огромными устаревшими программами, - это использование псевдонимов (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 и сам модуль свечения.

+0

Отличная идея! Но я бы вернул значения в качестве словаря, а не просто распечатывал их (да, я знаю, OP использовал печать, но в этом случае это функция полезности) ... – SwedishOwlSerpent

+0

@SwedishOwlSerpent: исходный код сделал именно это, Я изменил его, чтобы быть ближе к вопросу. Это не займет много времени, чтобы изменить его. – cdarke

Смежные вопросы