【问题标题】:Check for a module in Python without using exceptions在不使用异常的情况下检查 Python 中的模块
【发布时间】:2010-11-16 12:16:31
【问题描述】:

我可以检查 Python 中的模块,例如:

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

但我不想使用 try/except。有没有办法做到这一点? (它应该适用于 Python 2.5.x。)

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

【问题讨论】:

  • 你为什么不想使用try/except?只是好奇?
  • try/except 有什么问题?这是最有效的机制。
  • 没有草莓怎么做草莓蛋糕?
  • @S.Lott:“只是因为我想知道有没有办法”——学习对我来说似乎是一个很好的理由。
  • @EthanFurman:“仅仅因为我想以错误的方式做事”不会把一个坏问题变成一个神奇的好问题。

标签: python module python-module


【解决方案1】:

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

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

【讨论】:

  • 如果 'some_module' 不存在,这个程序给出一个异常: Traceback (last recent call last): File "", line 1, in ImportError: No module named浅浅的
  • @Bloguero,这正是为什么人们在可能以可预测方式失败的语句周围放置一个 try/except 的原因(并且存在失败的解决方法 - 或者需要特殊补救措施 - 等等)。用准将格蕾丝·默里·霍珀 (Grace Murray Hopper) 的不朽名言来说,“请求宽恕比请求许可更容易”;-)。
【解决方案2】:

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

【讨论】:

【解决方案3】:

您可以阅读here,了解 Python 如何定位和导入模块。如果您愿意,您可以在 python 中复制此逻辑,搜索 sys.modules、sys.meta_path 和 sys.path 以查找所需的模块。

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

【讨论】:

  • @Rodrigo,请看下面我的回答——我希望不是“非常困难”(给定的假钩子只会触发假的 'GIVINGUP!' 附加到 sys.path 末尾的路径项。路径,因此只有在其他所有定位模块的尝试都已经失败时才尝试...)。
  • 我已经为你的回答投了赞成票!它非常聪明,可以重新实现我认为必要的导入逻辑。
【解决方案4】:

执行请求需要技巧(事实上,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 的原因;-)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2011-05-01
    • 2010-12-29
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多