2017-02-09 5 views
3

이를 입력하면 가져 오지 않고 설치된 패키지에 대한 설명을 얻을 :실제 그것이

import somemodule 
help(somemodule) 

가 페이지 된 패키지 설명을 인쇄합니다. 이 패키지를 현재 네임 스페이스로 가져 오지 않고 문자열과 동일한 설명을 가져와야합니다. 이것이 가능한가? 파이썬에서는 가능하기 때문에 가능하지만, 가장 우아하고 파이썬적인 방법은 무엇입니까?

사이드 노트 : 나는 별도의 프로세스를 열고 자사의 표준 출력 ... 캡처하지 않고 의미 우아한 방법으로, 즉)

을하는 오지 않음하지만 설치 패키지로 들여다과 설명을 얻을 수있는 방법이있다 ? importlib.abc.InspectLoader 일 수도 있습니다. 그러나 나는 그것이 필요한 방식으로 작동하도록하는 방법을 모른다.

업데이트 : 네임 스페이스를 오염시키지 않아도되지만 메모리 나 종속 모듈의 흔적을 남기지 않고 sys.modules 등을 남기지 않고도이 작업을 수행 할 수 있습니다.

업데이트 : 누구나 내가 필요한 이유를 묻기 전에 - 설치된 모든 파이썬 패키지를 설명과 함께 나열하고 싶습니다. 그러나 이것 이후에 나는 그들을 많이 가질 수 있기 때문에 sys.modules에 가져 오거나 메모리에 과도한 공간을 차지하지 않으려합니다.

+0

설명해 주셔서 감사합니다. 그게 가능하다. –

답변

0

당신이 깔끔한 글로벌 네임 스페이스를 유지하기 만 걱정하는 경우 글쎄, 당신은 항상 함수에서 가져올 수 :

>>> def get_help(): 
...  import math 
...  help(math) 
... 
>>> math 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'math' is not defined 
+0

문제는 그것이 메모리와 'sys.modules'에로드 된 상태로 남아 있다는 것이다. 나는 이것에 대해 명확하지 않아서 질문을 업데이트 할 것이다. –

-1

내가 내가 제대로 이해한다면, 당신이 읽고 싶은, 다른 접근 방식을 제안 패키지의 일부를 가져 오지 않고 (심지어 로컬 범위가있는 함수 내에서) 가져올 수 있습니다. 그 방법은 파이썬이 할 수 있도록 모듈을 가져 오기위한 대안으로 (python_path)/Lib/site-packages/(package_name) /에 접근하고 각 파일의 내용을 읽는 방법을 제안합니다.

+0

이것은 때때로 작동 할 것이지만, 많은 파이썬 문서화 문자열이 포맷팅 표현식에서 '__doc__' 속성을 설정하는 완전히 다른 코드 조각으로 생성됩니다. 이 경우 의사 문자열을 얻기 위해 통역사를 다시 구현해야합니다. –

1

도움말 문자열을 얻기 위해 모듈을 가져와야하는 이유는 대부분의 경우 도움말 문자열이 실제로 코드에서 생성된다는 것입니다. 실제 문자열을 재구성하기 위해 작은 파이썬 인터프리터를 작성해야하기 때문에 해당 패키지의 텍스트를 파싱하여 문자열을 파싱하는 것은 무의미하게 어렵습니다.

this answer을 기반으로 임시로 가져온 모듈을 완전히 삭제하는 방법이 있습니다.이 모듈은 2003 년 약 http://web.archive.org/web/20080926094551/http://mail.python.org/pipermail/python-list/2003-December/241654.html에 파이썬 메일 링리스트에 나타난 스레드를 요약합니다. 여기에 설명 된 방법은 모듈이 다른 곳에서 참조되지 않은 경우에만 일반적으로 작동합니다. 그렇지 않으면 모듈은 기존 sys.modules 항목을 사용하는 대신 import이 처음부터 다시로드한다는 의미에서 모듈이 언로드되지만 모듈은 여전히 ​​메모리에 저장됩니다.

대략적으로 원하는 기능을 수행하고 모듈이 언로드 된 것으로 보이지 않는 경우 경고를 인쇄하는 기능입니다.

import sys, warnings 
def get_help(module_name): 
    modules_copy = sys.modules.copy() 
    module = __import__(module_name) 
    h = help(module) 
    for modname in list(sys.modules): 
     if modname not in modules_copy: 
      del sys[modname] 
    if sys.getrefcount(module) > 1: 
     warnings.warn('Module {} is likely not to be completely wiped'.format(module_name)) 
    del module 
    return h 

내가 만들 이유 : 링크 된 답변에서 제안 된 솔루션과 달리,이 기능은 정말 하나 개의 패키지를 가져 오는 sys.modules에 다른 외부 패키지를 가져올 수 있다는 사실을 포함한 모듈을로드의 모든 부작용을 처리 최종 루프의 키 목록은 반복 할 때 사전 (또는 다른 반복 가능)을 수정하는 것은 좋지 않다는 것입니다. 적어도 파이썬 3에서는 dict.keys()이 고정 된 복사본이 아닌 사전 자체에 의해 뒷받침되는 반복 가능 (iterable)을 반환합니다.h = ...return h이 필요한지 확실하지 않지만, 최악의 경우 h은 단지 None입니다.

+0

로그를 보내 주셔서 감사합니다. 그러나 여전히 그것은 약간 허약하다고 느낍니다. 따라서 필자는 모듈 가져 오기, 필요한 문자열의 파이핑 및이 프로세스의 제거를 위해 별도의 프로세스를 사용하는 경향이 있습니다. 이것은 오류 증거로 보이며 데이터 수집 중에 주요 프로세스를 차단하지 않을 것입니다. –

+0

귀하의 방법은 실제로 더 신뢰할 수 있습니다. 당신은 자신의 답변을 게시해야합니다. 또한, [이 질문] (http://stackoverflow.com/q/42142660/2988730) 위의 대답을 작성에서 왔어. –

+0

일단 솔루션이 올바르게 작동하면 내 대답을 게시 할 것입니다. –