在不使用异常的情况下检查Python中的模块
我可以在Python中检查模块,例如:在不使用异常的情况下检查Python中的模块,python,module,python-module,Python,Module,Python Module,我可以在Python中检查模块,例如: try: import some_module except ImportError: print "No some_module!" 但是我不想使用try/except。有没有办法做到这一点?(它应该可以在Python 2.5.x上运行。) 注意:不使用try/except的原因是任意的,只是因为我想知道是否有一种方法可以在不使用异常的情况下对其进行测试。所有导入模块的方法在调用时都会引发异常。你可以先尝试自己搜索文件系统,但是有很多事情要考虑
try:
import some_module
except ImportError:
print "No some_module!"
但是我不想使用try/except。有没有办法做到这一点?(它应该可以在Python 2.5.x上运行。)
注意:不使用try/except的原因是任意的,只是因为我想知道是否有一种方法可以在不使用异常的情况下对其进行测试。所有导入模块的方法在调用时都会引发异常。你可以先尝试自己搜索文件系统,但是有很多事情要考虑。
不确定您为什么不想使用
尝试
/,但
除外。这是最好的解决方案,比我提供的要好得多。也许您应该首先澄清这一点,因为您可能有一个无效的理由不使用try
/,除了sys.modules字典似乎包含您需要的信息。您可以阅读Python如何定位和导入模块。如果愿意,可以在python中复制此逻辑,搜索sys.modules、sys.meta_path和sys.path以查找所需的模块
然而,我想,预测它是否能够在不使用异常处理的情况下成功解析(考虑编译的二进制模块)是非常困难的 执行请求需要诡计(一个raise
语句实际上是不可避免的,因为这是PEP 302中指定的导入钩子说“我不处理此路径项”!)的唯一方法,但以下内容将避免任何尝试
/,除了
:
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
当然,在现实生活中,为了避免完全正常的尝试
/,除了
,这些都是荒谬的长度,但它们似乎满足了提出的要求(希望能够促使Python向导开始他们自己的研究——找出所有这些代码是如何以及为什么按照要求工作的,这实际上是很有启发性的,这就是为什么我这一次不提供详细的解释和URL;-).为什么不使用try/except?只是好奇?try/except有什么问题?它是最有效的机制。没有草莓你怎么做草莓蛋糕?@s.Lott:“这只是因为我想知道是否有办法”——学习对我来说似乎是一个很好的理由。@EthanFurman:“仅仅因为我想用错误的方式来做”不会让一个糟糕的问题变成一个神奇的好问题。这只包含已经导入的模块:如果“some_module”不存在,这个程序会给出一个异常:Traceback(最近的调用last):File”,第1行,输入错误:没有名为asasasa@Bloguero,这正是为什么人们会对可能以可预测的方式失败的陈述进行尝试/排除(对于其失败存在变通办法——或者需要特殊补救措施——等等)。用格雷斯·默里·霍珀准将不朽的话来说,“请求原谅比获得许可更容易”;-)@Rodrigo,请看下面我的答案——我希望不是“很难”(给定的假钩子只会触发附加到sys.path末尾的假“GIVINGUP!”路径项,因此,只有在其他所有查找模块的尝试都失败时才会尝试……).我已经对你的答案投了赞成票!它非常聪明,并且致力于重新实现我认为必要的导入逻辑。