This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2012年05月17日 23:35 by takluyver, last changed 2022年04月11日 14:57 by admin. This issue is now closed.
| Messages (4) | |||
|---|---|---|---|
| msg161025 - (view) | Author: Thomas Kluyver (takluyver) * | Date: 2012年05月17日 23:35 | |
I've come across a difference from 3.2 to 3.3 while running the IPython test suite. It occurs when a directory on sys.path has been used for an import, then deleted without being removed from sys.path. Previous versions of Python ignore the nonexistent folder, but in 3.3 a FileNotFound error appears.
This might be by design (errors should never pass silently), but I haven't found it mentioned in the What's New for 3.3.
$ cat import.py
import sys, os, shutil
os.mkdir('foo')
with open('foo/bar.py', 'w'):
pass
sys.path.insert(0, 'foo/')
import bar # Caches a FileFinder for foo/
shutil.rmtree('foo')
import random # Comes later on sys.path
$ python3.2 import.py
$ python3.3 import.py
Traceback (most recent call last):
File "import.py", line 8, in <module>
import random
File "<frozen importlib._bootstrap>", line 1162, in _find_and_load
File "<frozen importlib._bootstrap>", line 1124, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 1078, in _find_module
File "<frozen importlib._bootstrap>", line 927, in find_module
File "<frozen importlib._bootstrap>", line 973, in find_module
File "<frozen importlib._bootstrap>", line 1005, in _fill_cache
FileNotFoundError: [Errno 2] No such file or directory: 'foo/'
The last entry in that traceback is calling "_os.listdir(path)".
|
|||
| msg161026 - (view) | Author: Eric Snow (eric.snow) * (Python committer) | Date: 2012年05月18日 00:15 | |
The caching mechanism is going to check for changes in the directory. So the recommendation is to clear the cache manually: <quote> The default finders used by import now utilize a cache of what is contained within a specific directory. If you create a Python source file or sourceless bytecode file, make sure to call importlib.invalidate_caches() to clear out the cache for the finders to notice the new file. </quote> (see http://docs.python.org/dev/whatsnew/3.3.html#porting-python-code) That section doesn't really talk about the directory side of things, but calling importlib.invalidate_caches() works great to eliminate the error in your example. |
|||
| msg161027 - (view) | Author: Eric Snow (eric.snow) * (Python committer) | Date: 2012年05月18日 00:16 | |
...rather, the error caused by your example. :) |
|||
| msg168616 - (view) | Author: Roundup Robot (python-dev) (Python triager) | Date: 2012年08月20日 03:18 | |
New changeset bfd04bfb55c5 by Nick Coghlan in branch 'default': Close #14846: Handle a sys.path entry going away http://hg.python.org/cpython/rev/bfd04bfb55c5 |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:57:30 | admin | set | github: 59051 |
| 2012年08月20日 03:18:39 | python-dev | set | status: open -> closed nosy: + python-dev messages: + msg168616 resolution: fixed stage: resolved |
| 2012年05月18日 01:48:50 | eric.smith | set | nosy:
+ eric.smith |
| 2012年05月18日 00:16:58 | eric.snow | set | messages: + msg161027 |
| 2012年05月18日 00:15:49 | eric.snow | set | nosy:
+ brett.cannon, pitrou, eric.snow messages: + msg161026 |
| 2012年05月17日 23:35:08 | takluyver | create | |