Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3d1c080

Browse files
gh-93461: Invalidate sys.path_importer_cache entries with relative paths (GH-93653)
(cherry picked from commit09243b8)Co-authored-by: Christian Heimes <christian@python.org>
1 parent536af65 commit3d1c080

File tree

5 files changed

+36
-14
lines changed

5 files changed

+36
-14
lines changed

‎Lib/importlib/_bootstrap_external.py‎

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,7 +1394,9 @@ def invalidate_caches():
13941394
"""Call the invalidate_caches() method on all path entry finders
13951395
stored in sys.path_importer_caches (where implemented)."""
13961396
forname,finderinlist(sys.path_importer_cache.items()):
1397-
iffinderisNone:
1397+
# Drop entry if finder name is a relative path. The current
1398+
# working directory may have changed.
1399+
iffinderisNoneornot_path_isabs(name):
13981400
delsys.path_importer_cache[name]
13991401
elifhasattr(finder,'invalidate_caches'):
14001402
finder.invalidate_caches()
@@ -1562,9 +1564,12 @@ def __init__(self, path, *loader_details):
15621564
loaders.extend((suffix,loader)forsuffixinsuffixes)
15631565
self._loaders=loaders
15641566
# Base (directory) path
1565-
self.path=pathor'.'
1566-
ifnot_path_isabs(self.path):
1567-
self.path=_path_join(_os.getcwd(),self.path)
1567+
ifnotpathorpath=='.':
1568+
self.path=_os.getcwd()
1569+
elifnot_path_isabs(path):
1570+
self.path=_path_join(_os.getcwd(),path)
1571+
else:
1572+
self.path=path
15681573
self._path_mtime=-1
15691574
self._path_cache=set()
15701575
self._relaxed_path_cache=set()

‎Lib/test/test_import/__init__.py‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -927,15 +927,15 @@ def test_missing_source_legacy(self):
927927
m=__import__(TESTFN)
928928
try:
929929
self.assertEqual(m.__file__,
930-
os.path.join(os.getcwd(),os.curdir,os.path.relpath(pyc_file)))
930+
os.path.join(os.getcwd(),os.path.relpath(pyc_file)))
931931
finally:
932932
os.remove(pyc_file)
933933

934934
deftest___cached__(self):
935935
# Modules now also have an __cached__ that points to the pyc file.
936936
m=__import__(TESTFN)
937937
pyc_file=importlib.util.cache_from_source(TESTFN+'.py')
938-
self.assertEqual(m.__cached__,os.path.join(os.getcwd(),os.curdir,pyc_file))
938+
self.assertEqual(m.__cached__,os.path.join(os.getcwd(),pyc_file))
939939

940940
@skip_if_dont_write_bytecode
941941
deftest___cached___legacy_pyc(self):
@@ -951,7 +951,7 @@ def test___cached___legacy_pyc(self):
951951
importlib.invalidate_caches()
952952
m=__import__(TESTFN)
953953
self.assertEqual(m.__cached__,
954-
os.path.join(os.getcwd(),os.curdir,os.path.relpath(pyc_file)))
954+
os.path.join(os.getcwd(),os.path.relpath(pyc_file)))
955955

956956
@skip_if_dont_write_bytecode
957957
deftest_package___cached__(self):
@@ -971,10 +971,10 @@ def cleanup():
971971
m=__import__('pep3147.foo')
972972
init_pyc=importlib.util.cache_from_source(
973973
os.path.join('pep3147','__init__.py'))
974-
self.assertEqual(m.__cached__,os.path.join(os.getcwd(),os.curdir,init_pyc))
974+
self.assertEqual(m.__cached__,os.path.join(os.getcwd(),init_pyc))
975975
foo_pyc=importlib.util.cache_from_source(os.path.join('pep3147','foo.py'))
976976
self.assertEqual(sys.modules['pep3147.foo'].__cached__,
977-
os.path.join(os.getcwd(),os.curdir,foo_pyc))
977+
os.path.join(os.getcwd(),foo_pyc))
978978

979979
deftest_package___cached___from_pyc(self):
980980
# Like test___cached__ but ensuring __cached__ when imported from a
@@ -998,10 +998,10 @@ def cleanup():
998998
m=__import__('pep3147.foo')
999999
init_pyc=importlib.util.cache_from_source(
10001000
os.path.join('pep3147','__init__.py'))
1001-
self.assertEqual(m.__cached__,os.path.join(os.getcwd(),os.curdir,init_pyc))
1001+
self.assertEqual(m.__cached__,os.path.join(os.getcwd(),init_pyc))
10021002
foo_pyc=importlib.util.cache_from_source(os.path.join('pep3147','foo.py'))
10031003
self.assertEqual(sys.modules['pep3147.foo'].__cached__,
1004-
os.path.join(os.getcwd(),os.curdir,foo_pyc))
1004+
os.path.join(os.getcwd(),foo_pyc))
10051005

10061006
deftest_recompute_pyc_same_second(self):
10071007
# Even when the source file doesn't change timestamp, a change in

‎Lib/test/test_importlib/import_/test_path.py‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,10 +202,11 @@ def __init__(self):
202202
definvalidate_caches(self):
203203
self.called=True
204204

205-
cache= {'leave_alone':object(),'finder_to_invalidate':FakeFinder()}
205+
key=os.path.abspath('finder_to_invalidate')
206+
cache= {'leave_alone':object(),key:FakeFinder()}
206207
withutil.import_state(path_importer_cache=cache):
207208
self.machinery.PathFinder.invalidate_caches()
208-
self.assertTrue(cache['finder_to_invalidate'].called)
209+
self.assertTrue(cache[key].called)
209210

210211
deftest_invalidate_caches_clear_out_None(self):
211212
# Clear out None in sys.path_importer_cache() when invalidating caches.
@@ -214,6 +215,16 @@ def test_invalidate_caches_clear_out_None(self):
214215
self.machinery.PathFinder.invalidate_caches()
215216
self.assertEqual(len(cache),0)
216217

218+
deftest_invalidate_caches_clear_out_relative_path(self):
219+
classFakeFinder:
220+
definvalidate_caches(self):
221+
pass
222+
223+
cache= {'relative_path':FakeFinder()}
224+
withutil.import_state(path_importer_cache=cache):
225+
self.machinery.PathFinder.invalidate_caches()
226+
self.assertEqual(cache, {})
227+
217228

218229
classFindModuleTests(FinderTests):
219230
deffind(self,*args,**kwargs):

‎Lib/test/test_importlib/test_api.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ def find_module(self, *args):
395395
definvalidate_caches(self):
396396
self.called=True
397397

398-
key='gobledeegook'
398+
key=os.path.abspath('gobledeegook')
399399
meta_ins=InvalidatingNullFinder()
400400
path_ins=InvalidatingNullFinder()
401401
sys.meta_path.insert(0,meta_ins)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
:func:`importlib.invalidate_caches` now drops entries from
2+
:data:`sys.path_importer_cache` with a relative path as name. This solves a
3+
caching issue when a process changes its current working directory.
4+
5+
``FileFinder`` no longer inserts a dot in the path, e.g.
6+
``/egg/./spam`` is now ``/egg/spam``.

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp