2013-10-25 6 views
2

Я реализую крючок импорта, который автоматически устанавливает недостающие модули с помощью pip.Получение полного имени модуля в Import hook

Пока он работает нормально с простыми модулями (которые имеют только один уровень), например unipath. Однако, если я попытаюсь использовать его с многоуровневым импортом, например zope.interface, импортер получает только первую часть (zope). Это приводит к сбою, поскольку в PyPI не существует zope.

Любая идея о том, как добиться получения полного имени модуля при импорте?

Вот некоторый код:

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

Ouch, ужасная идея. Не устанавливайте автоматически; что, если есть версии несовместимости? –

+2

Не беспокойтесь @MartijnPieters! Уверяю вас, что остальная часть приложения намного опаснее: P Это просто для удовольствия. –

+0

Если вы замените '__import__', тогда вы получите глобальные модули модуля импорта модуля и гораздо больше информации. – User

ответ

2

Если заменить __import__ то вы получаете модуль глобал, что импорт модуля и гораздо больше информации.

+0

Спасибо! Для записи фактический код с использованием этого метода можно найти здесь: https://github.com/chaosct/pipimport/blob/79120eea4aed66743b5dbab47ba18a2d49c19638/pipimport/__init__.py –

Смежные вопросы