2017-10-19 8 views
1

파이썬에서 일종의 가져 오기 종속성 추적에 액세스하려고합니다.파이썬 모듈에서 가져온 모듈 목록을 얻는 방법

모듈로 가져온 모든 모듈의 버전을 설명하는 __dependencies__ dict을 내 모듈에 추가하기로 결정했습니다.

내 모듈에서 가져온 모듈 목록을 자동으로 가져오고 싶습니다. 바람직하게는 모듈의 마지막 줄에 있습니다.

ModuleFinder (How to list imports within a Python module?으로 제안)은 이미로드 된 모듈에 대한 검사가 수행되어야하므로 작동하지 않습니다.

ModuleFinder 또 다른 문제는 파이썬 스크립트 (지점 if __name__ == '__main__' 포함)이 아닌 모듈을 검사한다는 것입니다.

우리가 장난감 스크립트 script.py 고려하는 경우 :

if __name__ == '__main__': 
    import foo 

를 한 후 결과는 다음과 같습니다

스크립트 모듈로 가져온 경우 거짓이어야한다
>>> mf = ModuleFinder 
>>> mf.run_script('script.py') 
>>> 'foo' in mf.modules 
True 

.

내 모듈에서 가져온 모듈 만 가져올 수 있습니다. sys.modules (What is the best way of listing all imported modules in python?에 의해 제안 됨)이 너무 많이 반환됩니다.

sys.modules의 스냅 샷과 모듈 코드의 시작과 끝을 비교할 수 있습니다. 하지만 그 방법은 내 모듈에서 사용하는 모든 모듈을 놓치고 다른 모듈에서는 이전에 가져온 것입니다.

모듈을 가져 오는 모듈도 나열해야합니다.

우리가 장난감 모듈 example.py을 고려하는 경우 :

>>> import example 
>>> moduleImports(example) 
{'foo': <module 'foo' from ... >, 
'baz': <module 'baz' from ...>} 

(그것은 또한 수입있는 모듈의 재귀 또는 foo.bar 주어진 표시 줄을 포함 할 수있는 모듈입니다 : 같은

from foo import bar 
import baz 

이 결과는해야한다).

from foo import bar 
import bar 

가 어떻게 그것을 방지 할 수 있습니다 ( How to list imported modules?에 따라) globls()

사용과 같이 수동으로 비 모듈 가져 오기를 다루는 저를 필요로?

지금까지 내 솔루션에 또 다른 문제가 있습니다. PyCharm은 리팩토링에 대한 수동 가져 오기 작업을 정리하는 경향이있어이를 유지하기가 어렵습니다.

+0

'ModuleFinder'가 작동하지 않는 이유는 분명하지 않습니다. 사실, 반드시 작동 할 수있는 유일한 것이어야합니다. 이미로드 된 모듈과 모듈에서 처음으로 가져온 모듈을 어떻게 구분할 것입니까? 또한 모듈에없는 가져 오기 (예 : 내부 함수)를 전역 범위로 식별하는 방법은 무엇입니까? – ekhumoro

+0

@ekhumoro 왜 귀하의 의견에 대해 알려 드리지 못했습니다. 수정 된 질문을 확인한 다음 알려 주시면 [편집] 태그를 삭제할 수 있습니다. – abukaj

+0

'ModuleFinder'가 모듈에서 작동하지 않는다는 주장은 분명히 거짓입니다 - [python docs의 예제] (https://docs.python.org/2/library/modulefinder.html#example-usage-of- 모듈 파인더). 나는 왜 당신이 그것을 사용하면 안되는 다른 좋은 이유를 보지 않는다. – ekhumoro

답변

0

당신은 예를 들어, inspect moudule

을 사용할 수 있습니다 : 당신은 그냥 가져 로컬 모듈을 원하는 경우

다음
import inspect 
import os 
m = inspect.getmembers(os) # get module content 
filter(lambda x: inspect.ismodule(x[1]), m) # filter dependant modules 

사용 live example

있습니다

filter(lambda x: inspect.ismodule(x[1]), locals().items()) # filter dependant modules 

다른 live example

+0

감사합니다. 불행히도 현재의 솔루션 ('globals()'필터링)과 동일한 단점이 있습니다. 이것은 모듈이 아닌 import를 생략합니다 ('from foo import bar'' foo'가 눈에 띄지 않게됩니다). – abukaj

+0

@abukaj, 나는 수동으로 지정하지 않으면 파이썬이 범위를 가져 오지 않기 때문에 실제로 foo가 사용되지 않기 때문에 얻을 수 없다고 생각합니다./ – Netwave

+0

파이썬 모듈에서 일종의 가져 오기 추적이 필요합니다. – abukaj