在Python中检查模块而不使用异常

时间:2009-08-03 20:55:47

标签: python module python-module

我可以在Python中检查一个模块,例如:

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

但我不想使用try / except。有没有办法实现这个目标? (它应该适用于Python 2.5.x。)

注意:不使用try / except的原因是任意的,这只是因为我想知道是否有办法在不使用异常的情况下测试它。

4 个答案:

答案 0 :(得分:7)

执行请求需要诡计(并且一个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-Wizards想要开始他们自己的研究 - 找出所有这些代码确实如何以及为什么按要求工作的事实上是有益的,这就是为什么一旦我不提供详细的解释和URL ;-)。

答案 1 :(得分:1)

您可以阅读here有关Python如何定位和导入模块的信息。如果你愿意,你可以在python中复制这个逻辑,搜索sys.modules,sys.meta_path& sys.path查找所需的模块。

但是,我想,预测它是否会成功解析(考虑已编译的二进制模块)而不使用异常处理将是非常困难的!

答案 2 :(得分:0)

导入模块的所有方法在调用时都会引发异常。您可以先尝试自己搜索文件系统,但是有很多事情需要考虑。

不确定为什么您不想使用try / except。这是最好的解决方案,远比我提供的解决方案好得多。也许您应首先澄清一下,因为您可能没有使用try / except的原因。

答案 3 :(得分:-1)

sys.modules字典似乎包含您需要的信息。