Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 18 additions & 9 deletions Lib/pathlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,15 @@
# EBADF - guard agains macOS `stat` throwing EBADF
_IGNORED_ERROS = (ENOENT, ENOTDIR, EBADF)

_IGNORED_WINERRORS = (
21, # ERROR_NOT_READY - drive exists but is not accessible
)

def _ignore_error(exception):
return (getattr(exception, 'errno', None) in _IGNORED_ERROS or
getattr(exception, 'winerror', None) in _IGNORED_WINERRORS)


def _is_wildcard_pattern(pat):
# Whether this pattern needs actual matching using fnmatch, or can
# be looked up directly as a file.
Expand Down Expand Up @@ -535,7 +544,7 @@ def _iterate_directories(self, parent_path, is_dir, scandir):
try:
entry_is_dir = entry.is_dir()
except OSError as e:
if e.errno not in _IGNORED_ERROS:
if not _ignore_error(e):
raise
if entry_is_dir and not entry.is_symlink():
path = parent_path._make_child_relpath(entry.name)
Expand Down Expand Up @@ -1328,7 +1337,7 @@ def exists(self):
try:
self.stat()
except OSError as e:
if e.errno not in _IGNORED_ERROS:
if not _ignore_error(e):
raise
return False
return True
Expand All @@ -1340,7 +1349,7 @@ def is_dir(self):
try:
return S_ISDIR(self.stat().st_mode)
except OSError as e:
if e.errno not in _IGNORED_ERROS:
if not _ignore_error(e):
raise
# Path doesn't exist or is a broken symlink
# (see https://bitbucket.org/pitrou/pathlib/issue/12/)
Expand All @@ -1354,7 +1363,7 @@ def is_file(self):
try:
return S_ISREG(self.stat().st_mode)
except OSError as e:
if e.errno not in _IGNORED_ERROS:
if not _ignore_error(e):
raise
# Path doesn't exist or is a broken symlink
# (see https://bitbucket.org/pitrou/pathlib/issue/12/)
Expand Down Expand Up @@ -1388,7 +1397,7 @@ def is_symlink(self):
try:
return S_ISLNK(self.lstat().st_mode)
except OSError as e:
if e.errno not in _IGNORED_ERROS:
if not _ignore_error(e):
raise
# Path doesn't exist
return False
Expand All @@ -1400,7 +1409,7 @@ def is_block_device(self):
try:
return S_ISBLK(self.stat().st_mode)
except OSError as e:
if e.errno not in _IGNORED_ERROS:
if not _ignore_error(e):
raise
# Path doesn't exist or is a broken symlink
# (see https://bitbucket.org/pitrou/pathlib/issue/12/)
Expand All @@ -1413,7 +1422,7 @@ def is_char_device(self):
try:
return S_ISCHR(self.stat().st_mode)
except OSError as e:
if e.errno not in _IGNORED_ERROS:
if not _ignore_error(e):
raise
# Path doesn't exist or is a broken symlink
# (see https://bitbucket.org/pitrou/pathlib/issue/12/)
Expand All @@ -1426,7 +1435,7 @@ def is_fifo(self):
try:
return S_ISFIFO(self.stat().st_mode)
except OSError as e:
if e.errno not in _IGNORED_ERROS:
if not _ignore_error(e):
raise
# Path doesn't exist or is a broken symlink
# (see https://bitbucket.org/pitrou/pathlib/issue/12/)
Expand All @@ -1439,7 +1448,7 @@ def is_socket(self):
try:
return S_ISSOCK(self.stat().st_mode)
except OSError as e:
if e.errno not in _IGNORED_ERROS:
if not _ignore_error(e):
raise
# Path doesn't exist or is a broken symlink
# (see https://bitbucket.org/pitrou/pathlib/issue/12/)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
``pathlib`` no longer raises when checking file and directory existence on
drives that are not ready