除了之外没有捕获ImportError

时间:2014-10-31 11:09:42

标签: python exception

当我注意到一些有趣的东西时,我对python很新,并且正在玩代码。

文件atomicPast.rb版本1:

import datetime

datatime.now()

我想从python提示符(不是Windows提示符)运行此代码。我就是这样做的:

>>import sys
>>sys.path.append("C:\\Users\\Myname\\Desktop\\Python")   
>>import atomicPast

我得到时间了。但是,执行import atomicPast再次无法正常工作,因为它已经导入。所以我发现了这个:

>>del sys.modules['atomicPast']

对我来说,这是一个不重要的,它的行为就像它,因为后续的import atomicPast会给我我的时间(只要它再次无效)。但是,我希望能够执行import atomicPast而不用担心它是否已经不被导入。我决定将unmport位添加到我的代码末尾以充当清理。

文件atomicPast.rb版本2:

import sys, inspect, os  

print datetime.datetime.now()

del sys.modules[    inspect.getfile(inspect.currentframe())[0:-3] ]    #1

在#1中,我得到没有扩展名(atomicPast)的文件名,并将其传递给del sys.modules [...]。

然而,在这一点上,atomicPast并没有完全导入(我猜?)所以试图不引入它并没有真正意义并引发异常:

  
    

导入atomicPast     2014-10-31 10:42:32.368000     Traceback(最近一次调用最后一次):       文件"",第1行,in     ImportError:在sys.modules中找不到已加载的模块atomicPast

  

有趣的是,unmport工作,我可以重复执行import atomicPast。

我以为我可以处理异常并摆脱错误打印。

在文件中:

...
try: 
    del sys.modules[    inspect.getfile(inspect.currentframe())[0:-3] ]    #1
except ImportError:
    pass

这不起作用。我仍然得到同样的例外。

进一步分析:

try:     
    #del sys.modules[   inspect.getfile(inspect.currentframe())[0:-3] ] 
    import cowabunga
except ImportError:
    print "in except"

以上按预期工作,导入cowabunga会导致ImportError并被捕获。

所以我坚持认识到某些情况下的某些异常可能无法捕获。

1 个答案:

答案 0 :(得分:1)

不要使用import来执行命令或调用函数。正确的方法是写这样的东西: atomicPast.py

import datetime
def time_now():
    print datetime.now()

然后从python控制台只需导入atomicPast()然后time_now() 导入命令用于导入库不执行代码,它不能用作php导入。在这里阅读 https://docs.python.org/3/reference/import.html 还有https://docs.python.org/2/library/sys.html#sys.modules

我的建议是只有在你知道自己在做什么的情况下才能使用sys.modules。