2016-07-08 2 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' 목록에 * name * 모듈 만 저장했기 때문입니다. 어쨌든 :'__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과 같은 내장 함수와 spection 모듈 자체는 생략합니다.

+0

좋은 아이디어! 하지만 나는 그 값을 사전에 인쇄하지 않고 사전에 반환했을 것입니다. (예, OP는 인쇄물을 사용했지만이 경우에는 유틸리티 함수입니다) ... – SwedishOwlSerpent

+0

@SwedishOwlSerpent : 원래 코드는 그랬지만, 질문에 더 가깝도록 수정했습니다. 그것을 바꾸는 데별로 도움이되지 않을 것입니다. – cdarke

관련 문제