Проверьте наличие модуля в Python без использования исключений - PullRequest
3 голосов
/ 04 августа 2009

Я могу проверить, что модуль в Python делает что-то вроде:

try:
  import some_module
except ImportError:
  print "No some_module!"

Но я не хочу использовать попробовать / кроме. Есть ли способ сделать это? (должно работать на Python 2.5.x.)

Примечание: Причина, по которой не используется попытка / исключение, является произвольной, просто я хочу знать, существует ли способ проверить это без использования исключений.

Ответы [ 4 ]

7 голосов
/ 04 августа 2009

Требуется хитрость для выполнения запроса (и один оператор raise фактически неизбежен, потому что это единственный способ, указанный в PEP 302 для ловушки импорта, чтобы сказать: «Я не имею дело с этим элементом пути» !), но следующее исключает любые try / except:

import sys

sentinel = object()

class FakeLoader(object):
  def find_module(self, fullname, path=None):
    return self
  def load_module(*_):
    return sentinel

def fakeHook(apath):
  if apath == 'GIVINGUP!!!':
    return FakeLoader()
  raise ImportError

sys.path.append('GIVINGUP!!!')
sys.path_hooks.append(fakeHook)

def isModuleOK(modulename):
  result = __import__(modulename)
  return result is not sentinel

print 'sys', isModuleOK('sys')
print 'Cookie', isModuleOK('Cookie')
print 'nonexistent', isModuleOK('nonexistent')

Это печатает:

sys True
Cookie True
nonexistent False

Конечно, это было бы абсурдным шагом в реальной жизни с бессмысленной целью избежать совершенно нормального try / except, но они, кажется, удовлетворяют поставленную задачу (и, мы надеемся, могут подсказать Python- Волшебники хотят начать собственное исследование - выяснить, как и почему весь этот код работает так, как требуется, на самом деле поучительно, поэтому на этот раз я не предлагаю подробных объяснений и URL; -).

1 голос
/ 04 августа 2009

Вы можете прочитать здесь о том, как Python находит и импортирует модули. Если вы хотите, вы можете повторить эту логику в python, выполняя поиск по sys.modules, sys.meta_path & sys.path, чтобы найти нужный модуль.

Однако предугадать, будет ли он успешно проанализирован (с учетом скомпилированных двоичных модулей) без использования обработки исключений, я думаю, очень сложно!

0 голосов
/ 04 августа 2009
Кажется, словарь

sys.modules содержит необходимую вам информацию.

0 голосов
/ 04 августа 2009

Все методы импорта модулей вызывают исключения при вызове. Вы могли бы сначала попытаться найти файл в файловой системе, но есть много вещей, которые следует учитывать.

Не знаю, почему вы не хотите использовать try / except. Это лучшее решение, намного лучшее, чем то, которое я предоставил. Возможно, вам следует сначала уточнить это, потому что у вас, вероятно, неправильная причина, по которой вы не используете try / except.

...