2014-10-07 6 views
0

의도적으로 섀도 ​​잉 된 모듈을 이 아닌sys.path 인 섀도우 잉 모듈로 가져 오는 것과 비슷한 질문이 있습니다. 꽤 쉽습니다. 단지 사용 , 내 모듈 sys.path에서하고sys.path 최대 높은입니다, 의도적이다 :섀도 잉 모듈을 sys.path에있는 섀도 잉 모듈로 가져 오기

from __future__ import absolute_import 

여기에 내 문제입니다!

더 구체적으로 말하자면, stdin에 액세스 할 수없는 파이썬 인터프리터를 작성하고 있지만 Tkinter을 사용할 수 있습니다. stdin에 액세스 할 수 없다는 의미는 보통 input, raw_inputgetpass을 사용할 수 없다는 것을 의미합니다. 나는 그들 자신의 방법으로 그들을 대체해야합니다. 처음 두 개는 다루기가 쉽습니다. 단지 __builtin__으로 교체합니다. getpass은 쉽지 않습니다. 사용자가 가져올 수도 있고 가져올 수도 없지만 실제로 가져올 수있는 것은 실제로 가져 오는 내용이 표준 모듈이 아니라 내 모듈인지 확인해야합니다. 따라서 모듈을 통해 입력을 얻을 수 있습니다. TkinterEntry 대신 stdin입니다. 그 부분을 처리했습니다. 내가 이해할 수없는 부분은 다른 모든 것을 표준 getpass에 전달하는 방법입니다. IE, getuser()getpass으로 처리해야합니다. 여기

내가 시도 내용은 다음과 같습니다

from __future__ import absolute_import 
import sys 
pathToThisGetpass = sys.path.pop(1) # I know that the shadowing getpass is at index 1. 
import getpass as realGetpass   # Since the path doesn't contain this getpass, this should be the real one, right? 
sys.path.insert(1, pathToThisGetpass) # Put this getpass module back into the path again 

def getuser(): 
    print("I am " + str(getuser)) 
    print("I should call " + str(realGetpass.getuser)) 
    return realGetpass.getuser() 

내가 getuser() 실패 이유를 단지 내가 볼 수있는 두 인쇄 문에 추가하고, 나는이 인쇄 것을 발견

I am <function getuser at 0x026D8A30> 
I should call <function getuser at 0x026D8A30> 

플러스 나는 무한 재귀로 끝난다.

그래서 ... 어떤 생각을 어떻게 해결할 수 있습니까? 이 재생을 시도하는

는 다음 sys.path에 들어있는 폴더를 추가, getpass.py 그것을 이름, 내가 위에서 가지고있는 것과 같은 파일을 작성하고 실행에 대한 답변으로 게시

import getpass 
getpass.getuser() 
+0

['imp.load_module'] (https://docs.python.org/2/library/imp.html#imp.load_module)을 사용해 보셨나요? – 9000

+0

@ 9000 - 나는 그렇지 않습니다. 그게 저에게 효과가 있습니까? 내가 링크 한 문서를 읽었을 때 약간 혼란스러워 보입니다. 답변으로 실제 사례를 들려 줄 수 있습니까? – ArtOfWarfare

+0

@ 9000 - 즉, 내가 경로를 가면 그림자가있는'getpass '에 어떻게 접근 할 수 있는지 혼란 스럽다.'import ...'의'as '부분과 같은 것이 없다. .. '라고하면 다른 이름으로 언급 할 수 있습니다. – ArtOfWarfare

답변

1

(댓글 :)

imp.load_module을 사용하고 표준 검색을 무시하고 원하는 모듈을로드하십시오. 어떻게 든, (예를 들어, 자신에 sys.path에서 검색하여), 당신은 단지 해당 파일을 열 수 있습니다 가져올 파일의 경로를 배운다면

with open(off_path_name) as shadowed_module_file: 
    shadow_getpass = imp.load_module(
     'shadowed.getpass', # the name reported by the module, rather arbitrary 
     shadowed_module_file, # where we are reading it from 
     '', # we don't plan to reload this module normally, no suffix 
     ('', 'r', imp.PY_COMPILED) # Assuming it's getpass.pyc, use PY_COMPILED 
) 

같은 것이 그런 것 A와 shadow_getpass을 사용하는 말 정상적인 모듈.

오류 처리가 생략되었지만 적절한 예외를 잡기가 어렵지 않습니다.

관련 문제