Issue #16730: Don't raise an exception in

importlib.machinery.FileFinder when the directory has become
unreadable or a file. This brings semantics in line with Python 3.2
import.

Reported and diagnosed by David Pritchard.
This commit is contained in:
Brett Cannon 2013-01-11 15:40:12 -05:00
parent 8762595ef3
commit a9976b3e32
4 changed files with 1002 additions and 958 deletions

View File

@ -1395,8 +1395,9 @@ class FileFinder:
path = self.path
try:
contents = _os.listdir(path)
except FileNotFoundError:
# Directory has been removed since last import
except (FileNotFoundError, PermissionError, NotADirectoryError):
# Directory has either been removed, turned into a file, or made
# unreadable.
contents = []
# We store two cached versions, to handle runtime changes of the
# PYTHONCASEOK environment variable.

View File

@ -6,6 +6,9 @@ import errno
import imp
import os
import py_compile
import stat
import sys
import tempfile
from test.support import make_legacy_pyc
import unittest
import warnings
@ -147,6 +150,38 @@ class FinderTests(abc.FinderTests):
self.assertIsNotNone(finder.find_module(mod))
self.assertIsNone(finder.find_module(mod))
@unittest.skipUnless(sys.platform != 'win32',
'os.chmod() does not support the needed arguments under Windows')
def test_no_read_directory(self):
# Issue #16730
tempdir = tempfile.TemporaryDirectory()
original_mode = os.stat(tempdir.name).st_mode
def cleanup(tempdir):
"""Cleanup function for the temporary directory.
Since we muck with the permissions, we want to set them back to
their original values to make sure the directory can be properly
cleaned up.
"""
os.chmod(tempdir.name, original_mode)
# If this is not explicitly called then the __del__ method is used,
# but since already mucking around might as well explicitly clean
# up.
tempdir.__exit__(None, None, None)
self.addCleanup(cleanup, tempdir)
os.chmod(tempdir.name, stat.S_IWUSR | stat.S_IXUSR)
finder = self.get_finder(tempdir.name)
self.assertEqual((None, []), finder.find_loader('doesnotexist'))
def test_ignore_file(self):
# If a directory got changed to a file from underneath us, then don't
# worry about looking for submodules.
with tempfile.NamedTemporaryFile() as file_obj:
finder = self.get_finder(file_obj.name)
self.assertEqual((None, []), finder.find_loader('doesnotexist'))
def test_main():
from test.support import run_unittest
run_unittest(FinderTests)

View File

@ -12,6 +12,11 @@ What's New in Python 3.3.1?
Core and Builtins
-----------------
- Issue #16730: importlib.machinery.FileFinder now no longers raises an
exception when trying to populate its cache and it finds out the directory is
unreadable or has turned into a file. Reported and diagnosed by
David Pritchard.
- Issue #16906: Fix a logic error that prevented most static strings from being
cleared.

File diff suppressed because it is too large Load Diff