@@ -298,6 +298,16 @@ def unload(name):
298298 except KeyError :
299299 pass
300300
301+ def _force_run (path , func , * args ):
302+ try :
303+ return func (* args )
304+ except OSError as err :
305+ if verbose >= 2 :
306+ print ('%s: %s' % (err .__class__ .__name__ , err ))
307+ print ('re-run %s%r' % (func .__name__ , args ))
308+ os .chmod (path , stat .S_IRWXU )
309+ return func (* args )
310+
301311if sys .platform .startswith ("win" ):
302312 def _waitfor (func , pathname , waitall = False ):
303313 # Perform the operation
@@ -340,7 +350,7 @@ def _rmdir(dirname):
340350
341351 def _rmtree (path ):
342352 def _rmtree_inner (path ):
343- for name in os .listdir ( path ):
353+ for name in _force_run ( path , os .listdir , path ):
344354 fullname = os .path .join (path , name )
345355 try :
346356 mode = os .lstat (fullname ).st_mode
@@ -350,9 +360,9 @@ def _rmtree_inner(path):
350360 mode = 0
351361 if stat .S_ISDIR (mode ):
352362 _waitfor (_rmtree_inner , fullname , waitall = True )
353- os .rmdir ( fullname )
363+ _force_run ( path , os .rmdir , fullname )
354364 else :
355- os .unlink ( fullname )
365+ _force_run ( path , os .unlink , fullname )
356366 _waitfor (_rmtree_inner , path , waitall = True )
357367 _waitfor (os .rmdir , path )
358368else :
@@ -366,27 +376,18 @@ def _rmtree(path):
366376 except OSError :
367377 pass
368378
369- def force_run (path , func , * args ):
370- try :
371- return func (* args )
372- except OSError as err :
373- if verbose >= 2 :
374- print ('%s: %s' % (err .__class__ .__name__ , err ))
375- print ('re-run %s%r' % (func .__name__ , args ))
376- os .chmod (path , stat .S_IRWXU )
377- return func (* args )
378379 def _rmtree_inner (path ):
379- for name in force_run (path , os .listdir , path ):
380+ for name in _force_run (path , os .listdir , path ):
380381 fullname = os .path .join (path , name )
381382 try :
382383 mode = os .lstat (fullname ).st_mode
383384 except OSError :
384385 mode = 0
385386 if stat .S_ISDIR (mode ):
386387 _rmtree_inner (fullname )
387- force_run (path , os .rmdir , fullname )
388+ _force_run (path , os .rmdir , fullname )
388389 else :
389- force_run (path , os .unlink , fullname )
390+ _force_run (path , os .unlink , fullname )
390391 _rmtree_inner (path )
391392 os .rmdir (path )
392393
0 commit comments