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:
parent
8762595ef3
commit
a9976b3e32
@ -1395,8 +1395,9 @@ class FileFinder:
|
|||||||
path = self.path
|
path = self.path
|
||||||
try:
|
try:
|
||||||
contents = _os.listdir(path)
|
contents = _os.listdir(path)
|
||||||
except FileNotFoundError:
|
except (FileNotFoundError, PermissionError, NotADirectoryError):
|
||||||
# Directory has been removed since last import
|
# Directory has either been removed, turned into a file, or made
|
||||||
|
# unreadable.
|
||||||
contents = []
|
contents = []
|
||||||
# We store two cached versions, to handle runtime changes of the
|
# We store two cached versions, to handle runtime changes of the
|
||||||
# PYTHONCASEOK environment variable.
|
# PYTHONCASEOK environment variable.
|
||||||
|
@ -6,6 +6,9 @@ import errno
|
|||||||
import imp
|
import imp
|
||||||
import os
|
import os
|
||||||
import py_compile
|
import py_compile
|
||||||
|
import stat
|
||||||
|
import sys
|
||||||
|
import tempfile
|
||||||
from test.support import make_legacy_pyc
|
from test.support import make_legacy_pyc
|
||||||
import unittest
|
import unittest
|
||||||
import warnings
|
import warnings
|
||||||
@ -147,6 +150,38 @@ class FinderTests(abc.FinderTests):
|
|||||||
self.assertIsNotNone(finder.find_module(mod))
|
self.assertIsNotNone(finder.find_module(mod))
|
||||||
self.assertIsNone(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():
|
def test_main():
|
||||||
from test.support import run_unittest
|
from test.support import run_unittest
|
||||||
run_unittest(FinderTests)
|
run_unittest(FinderTests)
|
||||||
|
@ -12,6 +12,11 @@ What's New in Python 3.3.1?
|
|||||||
Core and Builtins
|
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
|
- Issue #16906: Fix a logic error that prevented most static strings from being
|
||||||
cleared.
|
cleared.
|
||||||
|
|
||||||
|
1915
Python/importlib.h
1915
Python/importlib.h
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user