4

这是代码:

def make_dir(dir_name):
 if os.path.exists(dir_name):
  shutil.rmtree(dir_name)
 try:
  os.makedirs(dir_name)
 except OSError, e:
  print "ErrorNo: %s (%s)" % (e.errno, errno.errorcode[e.errno])
  raise

如果目录已经存在,我得到以下信息:

ErrorNo: 13 (EACCES)
Traceback (most recent call last):
  File "run_pnoise.py", line 167, in <module>
    make_dir("prep_dat")
  File "run_pnoise.py", line 88, in make_dir
    os.makedirs(dir_name)
  File "c:\Program Files (x86)\Python27\lib\os.py", line 157, in makedirs
    mkdir(name, mode)
WindowsError: [Error 5] Access is denied: 'prep_dat'

如果我再次运行该程序,它可以工作,表明该程序确实可以访问目录,因为 shutil.rmtree 调用显然是有效的。我想出了一个解决方法,我将发布。但是,是否有更好的解释和/或解决方法?

我的假设是在操作系统完全删除所有文件和子目录之前,shutil.rmtree 调用正在返回。此外,由于 shutil.rmtree 调用没有引发异常,因此 makedirs 调用上的任何 EACCESS (13) 错误都可能是虚假的。我的尝试(根据 Apalala 的评论修改):

def make_dir(dir_name):
    retry = True
    if os.path.exists(dir_name):
        shutil.rmtree(dir_name)
    while retry:
        try:
            # per Apalala, sleeping before the makedirs() eliminates the exception!
            time.sleep(0.001)
            os.makedirs(dir_name)
        except OSError, e:
            #time.sleep(0.001) # moved to before the makedirs() call 
            #print "ErrorNo: %s (%s)" % (e.errno, errno.errorcode[e.errno])
            if e.errno != 13: # eaccess
                raise
        else:
            retry = False

这似乎可靠地工作。其他帖子中提到了竞争条件问题,但这似乎不太可能,并且可能会导致不同的异常。

4

3 回答 3

0

在您之前的帖子中,您说该程序引发了“WindowsError”异常:

WindowsError: [Error 5] Access is denied: 'prep_dat'

您的代码可以使用 «except» 语句处理 «OSError» 异常,但它不能处理 «WindowsError» 异常...如果您想处理 «WindowsError» 异常,您必须使用如下 «except» 语句:

        except WindowsError:
#           (do some stuff)

请注意,您可以像这样处理任何异常:

except Exception, e:
    # this code will catch all raised exceptions. The variable «e» contains an instance of the raised exception.
于 2011-01-12T13:30:24.437 回答
0

您不能简单地使用«except»语句吗?

def make_dir(dir_name):
    retry = True
    if os.path.exists(dir_name):
        shutil.rmtree(dir_name)
    while retry:
        try:
            os.makedirs(dir_name)
        except OSError, e:
            time.sleep(0.001)
            if e.errno != 13: # eaccess
                raise
        except WindowsError:
#           (do some stuff)
        else:
            retry = False

它应该工作,不是吗?!

于 2011-01-06T15:42:28.783 回答
0

我有同样的问题,这看起来类似于我的解决方案,除了我在睡觉(0.1)。

于 2011-01-05T22:33:25.193 回答