Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 除非_Python_Exception - Fatal编程技术网

Python 除非

Python 除非,python,exception,Python,Exception,我对python相当陌生,当我注意到一些有趣的东西时,我就开始玩弄代码 文件atomicPast.rb版本1: import datetime datatime.now() 我希望从python提示符(而不是Windows提示符)运行此代码。我就是这样做的: >>import sys >>sys.path.append("C:\\Users\\Myname\\Desktop\\Python") >>import atomicPast 我把时间打印出

我对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']
对我来说,这是一个不重要的问题,它的行为与之类似,因为后续的导入atomicPast将为我赢得时间(只要它再次不重要)。然而,我希望能够执行importatomicpass,而不必担心它是否已经不受影响。我决定在代码的末尾添加不重要的部分作为清理

文件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还没有完全导入(我想是吧?),因此尝试取消对它的导入并没有真正意义,并引发异常:

导入原子过去 2014-10-31 10:42:32.368000 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 ImportError:在sys.modules中找不到加载的模块atomicPast

但有趣的是,不重要的工作,我可以重复执行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会导致导入恐怖并被捕获


因此,我不得不意识到,某些场景中的某些异常可能无法捕获

不要使用导入来执行命令或调用函数。正确的方法是这样写: 原子性

import datetime
def time_now():
    print datetime.now()
然后从python控制台导入atomicPast()和time_now() Import命令用于导入库而不是执行代码,它不像php导入那样工作。读这里 还有这里


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

首先,导入一个模块以产生副作用是非常糟糕的风格;将代码放入函数中,导入并执行该函数。其次,导入错误不是由您的
del
引起的(如果模块不存在,这将导致一个KeyError,而不是ImportError),而是由python导入机制的内部产生的,在加载文件后无法再找到模块(因为您已经删除了它)。因此,您无法在模块内捕获该异常;你可以在导入时抓住它,但这仍然是一种糟糕的风格。