2013-10-25 1 views
2

pip를 사용하여 누락 된 모듈을 자동으로 설치하는 가져 오기 훅을 구현 중입니다.가져 오기 후크에서 전체 모듈 이름 가져 오기

지금까지 간단한 모듈 (단 하나의 레벨 만 사용) (예 : unipath)로는 정상적으로 작동합니다. 그러나 zope.interface과 같이 다단계 가져 오기를 사용하려고하면 가져 오기 프로그램은 첫 번째 부분 (zope) 만 가져옵니다. 따라서 zope은 PyPI에 존재하지 않으므로 실패하게됩니다.

가져올 때 전체 모듈 이름을 얻는 방법에 대한 아이디어가 있으십니까? 여기에 몇 가지 코드

:

class PipLoader(object): 
    def __init__(self): 
     self.module = None 

    def find_module(self, name, path): 
     print "Will install module {}".format(name) 
     self.module = None 
     sys.meta_path.remove(self) 
     try: 
      pip_install(name) 
      self.module = importlib.import_module(name) 
     finally: 
      sys.meta_path.append(self) 
     return self 

    def load_module(self, name): 
     if not self.module: 
      raise ImportError("Unable to load module") 
     module = self.module 
     sys.modules[name] = module 
     return module 

def install(): 
    sys.meta_path.append(PipLoader()) 
+0

끔찍한 생각입니다. 자동 설치하지 마십시오. 버전 비 호환성이 있다면? –

+2

@MartijnPieters 걱정 마세요! 나머지 응용 프로그램이 훨씬 안전하지 않다는 것을 확신합니다. P 재미있는 것입니다. –

+0

'__import__'를 바꾸면 모듈의 전역 변수와 더 많은 정보를 얻을 수 있습니다. – User

답변

2

당신이 __import__를 교체 할 경우 다음 모듈이 모듈 수입 전역과 더 많은 정보를 얻을 수 있습니다.

+0

감사합니다. 기록을 위해이 기술을 사용하는 실제 코드는 https://github.com/chaosct/pipimport/blob/79120eea4aed66743b5dbab47ba18a2d49c19638/pipimport/__init__.py에서 찾을 수 있습니다. –