繁体   English   中英

在不使用异常的情况下检查Python中的模块

[英]Check for a module in Python without using exceptions

我可以像这样检查Python中的模块:

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

但是我不想使用try / except。 有没有办法做到这一点? (它应在Python 2.5.x上运行。)

注意:不使用try / except的原因是任意的,这仅仅是因为我想知道是否有一种方法可以在不使用异常的情况下进行测试。

执行请求需要花一些技巧(事实上,不可避免要执行一个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 ;-)。

您可以在此处阅读有关Python如何定位和导入模块的信息。 如果需要,您可以在python中复制此逻辑,在sys.modules,sys.meta_path和sys.path中进行搜索以查找所需的模块。

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

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

不知道为什么你不想使用try / except 这是最好的解决方案,远胜于我提供的解决方案。 也许您应该先澄清一下,因为您可能有一个不使用try / except的无效理由。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM