2016-07-08 5 views
1

インポートされたすべてのモジュールをバージョンとともにリストする必要があります。私のコードのいくつかは特定のバージョンでしか動作せず、パッケージのバージョンを保存しておきたいので、将来私はそれを再び見ることができます。対処する方法はありインポートされたモジュールのバージョンを表示するにはどうすればいいですか?

for module in modules: 
    print module.__version__ 

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

をしかし、私は今、リスト項目のバージョンを取得したい場合、それは動作しません:パッケージの名前をリスト 作品.__version__コマンドを文字列で実行するか、別の方法で名前とバージョンを取得する必要がありますか? その他の質問では、モジュール名のみが扱われます:How to list imported modules?

+0

これは、 'modules'リストにmodules * name *だけを保存しているからです。いずれの場合でも、 '__version__'属性は単なる慣例に過ぎないことに注意してください。多くのモジュールはそれを持っていません。 – Bakuriu

答えて

4

モジュール名ではなく、モジュール自体の文字列リストがあるためです。いないすべてのモジュールが__version__にバージョン情報を格納する規則に従うことを

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

注:これを試してみてください。

2

私が巨大なレガシープログラムで持っていた問題の1つは、エイリアスが使用された場所です(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のような組み込み関数と、spectionモジュール自体は省略しています。

+0

素晴らしいアイデア!しかし、私は値を辞書として返すだけではなく、それらを印刷します(はい、私は知っています、OPは印刷を使用しましたが、この場合はユーティリティ関数です)。 – SwedishOwlSerpent

+0

@SwedishOwlSerpent:元のコードは、私はその問題に近づくように修正しました。それを変更することはあまりありません。 – cdarke

関連する問題