2009-12-28 4 views
2

작은 스크립트를 작성했습니다. python 디렉토리에서 사용 가능한 모든 모듈 (설치 여부와 상관없이)을 검색하도록 설계되어 현재로드 된 모듈을 확인한 다음 원하는 모듈을 동적으로로드하는 옵션을 제공합니다. 후자는 문자열을 전달하기 때문에 __import__()을 사용합니다. (이것은 내가 문제가있는 곳입니다. 그러나 곧 다시 돌아올 것입니다 ...) 그런 다음 모듈을 "찾아보기"모든 옵션을 제공합니다 클래스, 함수 등 (dir([module name]) ... 사용).파이썬에서 모듈을 동적으로 가져 오기 위해 __import __()를 얻지 않습니다.이 이유는 sys.modules에 나타나지 않기 때문입니다.

문제 :

모듈이 동적으로로드 - 그것은 try/except 문에 포함되어 - 그것이는 "모듈이로드"고보고하고 실패 할 경우는 대만족 ...보고 성공하면 ... "로드 실패 ..."

모듈의 이름을 입력하면 (예 : "uu"라는 모듈) "로드 됨"이라고 표시됩니다. 그래서 나는 그것이로드된다는 것을 알고있다 - 그러나 내가 돌아 왔을 때 모든로드 된 모듈을 검사하는 함수를 호출하면 - 비어있다 (sys.modules 사용)

나는 파이썬이 모듈을 임시 위치에로드하고 있다고 생각하고있다. sys.modules이 아니므로 스크립트를 종료하고 sys.modules을 체크하면 거기에 없습니다.

+0

http://docs.python.org/tutorial/datastructures.html#dictionaries이 스크립트는 질문에 직접 넣어 너무 오래 여기되지 붙여 넣기 –

+0

를 스크립트를 붙여 넣습니다. –

+0

전체 스크립트를 붙여 넣을 수 없습니다 - gs가 맞습니다. 너무 오래되었습니다. 하지만 약속 할 수있는 긴 스크립트는 아닙니다. P. 나는 어떤 부분이 문제를 설명하기에 충분할만큼 중요한지는 알지 못한다. 그러나 요약하려고 시도 할 수있다 : var1 = raw_input ("로드 할 모듈 이름은 무엇인가? : ") __import __ (var1) 그런 다음 스크립트가 실행되는 동안 sys.modules로 검사합니다. -로드 된 모든 모듈의 긴 목록을 인쇄하지만 var1 (모듈 이름)은 그 목록 - 그렇습니다. 나는 그것이 로딩되어 있고 올바르게 쓰여 있음을 알고 있습니다 : P. –

답변

1

Nascent_Notes, 멋진 스크립트! uu (명령 3)을로드하고로드 된 모듈 (명령 2)의 목록을 인쇄하려고 시도했지만 둘 다 정상적으로 작동하는 것 같습니다. 내가 (명령 4) "모듈을 찾아"하려고하면

그러나, 나는 다음과 같은 오류가 발생합니다 :

HlpWiz>>> 4 
What module do you want to look more into?: uu 

*An error occurred - probably because the module isn't loaded or is misspelled* 

당신은 NameError: name 'uu' is not defined을 얻어야한다

#!/usr/bin/env python 
import sys 
__import__('uu') 
print(sys.modules['uu']) 
print(dir(uu)) 

실행 해보십시오. 변수 이름 uu에 액세스 할 수 없습니다 uu 모듈 -

는 그래서 __import__ 성공적으로 uu 모듈, 을 가져 있지만 그것이 글로벌 네임 스페이스에 uu를 추가하지 않는 것 같습니다. 그것은 sys.modules 그러나를 통해 액세스 할 수 있습니다

따라서,뿐만 아니라 input보다 훨씬 안전 raw_input을 사용

var_mod = raw_input("What module do you want to look more into?: ") 
    print "\n attempting to browse... please wait!" 
    time.sleep(2) 
    browse_mod(zlib = sys.modules[var_mod]) 

var_mod = input("What module do you want to look more into?: ") 
    print "\n attempting to browse... please wait!" 
    time.sleep(2) 
    browse_mod(zlib = var_mod) 

을 변경 (사용자가 예상치 못한 실행할 수 없습니다/악의적 인 명령), 또한 raw_input 여기서 원하는 것을 수행합니다.

작은 노트에

, 당신은 또한 더 파이썬

for i,line in enumerate(sample): 
    print i+1, line 

편집

i = 1 
for line in sample: 
    print i, line 
    i = i + 1 

을 변경할 수 있습니다 :

sys.modules에가 (사전의 줄임말)는 딕셔너리를 . Dicts는 전화 번호부와 같습니다. 이름 (더 잘 알려진 "키")을 지정하고 전화 번호 (또는 더 일반적으로 "가치")를 반환합니다.

sys.modules의 경우 키는 모듈 이름 (문자열)입니다. 값은 모듈 객체 자체입니다.

괄호 표기법을 사용하여 dict의 값에 액세스합니다. 따라서 uu은 단지 문자열이지만, sys.modules['uu']은 모듈 uu입니다.

는 현재 dicts에 전체 기사를 읽을 수 있습니다

+0

고마워 !!! 매력처럼 작동 했어 !! 너는 신이 보낸다!나는 i + 1의 변종을 시험해 보았고, 나는 ++를 시도했으나 효과가 없었습니다. 그래서 나는 생각했던 것, 즉 당신이 제안한 표현을 넣지 않을 것이라고 생각했습니다. 또한 필자는 "입력"이 pydocs 에서처럼 위험하다는 것을 알았지 만 변수에 할당 된 값을 문자열로 설정하지 못하게하는 유일한 방법 이었지만 sys를 사용하여 해결했습니다. 모듈 [var_mod] - "[]"할 일? 어떻게 문자열을 전달합니까? 또는 모듈을 sys.modules에 '추가'하는 것입니까? - 혼동 ... : 고마워 btw! –

+0

@Nascent_Notes, sys.modules 및 dicts에 대한 설명을 추가했습니다. 희망이 도움이됩니다. – unutbu

+0

k duh - Im 어리석은 롤 죄송합니다 - 네 dicts 알고, 나는 sys.modules가 dict임을 깨닫지 못했습니다. 그래서 나는 당신이 뭔가 특별한 것을하고 있다고 생각했습니다 - 설명해 주셔서 감사합니다! type() : P의 값을 스스로 가르쳤습니다. 다행히도 그것이 미래에 도움이 될 것입니다 ... –