Closed 0f1740dc-c717-4074-b009-75c706e553b2 closed 3 years ago
When you exec inspect.getouterframes() in directory, which no longer exists, then you get traceback, because the code traverse to os.getcwd() which fails.
Reproducer:
$ mkdir /tmp/bar
$ cd /tmp/bar
$ rmdir /tmp/bar
$ python3
Python 3.10.0rc2 (default, Sep 8 2021, 00:00:00) [GCC 11.2.1 20210728 (Red Hat 11.2.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import inspect
>>> inspect.getouterframes(inspect.currentframe())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python3.10/inspect.py", line 1653, in getouterframes
frameinfo = (frame,) + getframeinfo(frame, context)
File "/usr/lib64/python3.10/inspect.py", line 1623, in getframeinfo
filename = getsourcefile(frame) or getfile(frame)
File "/usr/lib64/python3.10/inspect.py", line 829, in getsourcefile
module = getmodule(object, filename)
File "/usr/lib64/python3.10/inspect.py", line 861, in getmodule
file = getabsfile(object, _filename)
File "/usr/lib64/python3.10/inspect.py", line 845, in getabsfile
return os.path.normcase(os.path.abspath(_filename))
File "/usr/lib64/python3.10/posixpath.py", line 383, in abspath
cwd = os.getcwd()
FileNotFoundError: [Errno 2] No such file or directory
I have reproduced on python3.10 and validated this is also happening for other python versions:
# PYTHON 3.9
$ mkdir /tmp/bar
$ cd /tmp/bar
$ rmdir /tmp/bar
$ python3.9
Python 3.9.5 (default, May 19 2021, 11:32:47)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import inspect
>>> inspect.getouterframes(inspect.currentframe())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.9/inspect.py", line 1529, in getouterframes
frameinfo = (frame,) + getframeinfo(frame, context)
File "/usr/lib/python3.9/inspect.py", line 1499, in getframeinfo
filename = getsourcefile(frame) or getfile(frame)
File "/usr/lib/python3.9/inspect.py", line 709, in getsourcefile
if getattr(getmodule(object, filename), '__loader__', None) is not None:
File "/usr/lib/python3.9/inspect.py", line 738, in getmodule
file = getabsfile(object, _filename)
File "/usr/lib/python3.9/inspect.py", line 722, in getabsfile
return os.path.normcase(os.path.abspath(_filename))
File "/usr/lib/python3.9/posixpath.py", line 379, in abspath
cwd = os.getcwd()
FileNotFoundError: [Errno 2] No such file or directory
# PYTHON 3.8
$ mkdir /tmp/bar
$ cd /tmp/bar
$ rmdir /tmp/bar
$ python3.8
Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import inspect
>>> inspect.getouterframes(inspect.currentframe())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.8/inspect.py", line 1503, in getouterframes
frameinfo = (frame,) + getframeinfo(frame, context)
File "/usr/lib/python3.8/inspect.py", line 1473, in getframeinfo
filename = getsourcefile(frame) or getfile(frame)
File "/usr/lib/python3.8/inspect.py", line 708, in getsourcefile
if getattr(getmodule(object, filename), '__loader__', None) is not None:
File "/usr/lib/python3.8/inspect.py", line 737, in getmodule
file = getabsfile(object, _filename)
File "/usr/lib/python3.8/inspect.py", line 721, in getabsfile
return os.path.normcase(os.path.abspath(_filename))
File "/usr/lib/python3.8/posixpath.py", line 379, in abspath
cwd = os.getcwd()
FileNotFoundError: [Errno 2] No such file or directory
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 76, in apport_excepthook
binary = os.path.realpath(os.path.join(os.getcwd(), sys.argv[0]))
FileNotFoundError: [Errno 2] No such file or directory
Original exception was:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.8/inspect.py", line 1503, in getouterframes
frameinfo = (frame,) + getframeinfo(frame, context)
File "/usr/lib/python3.8/inspect.py", line 1473, in getframeinfo
filename = getsourcefile(frame) or getfile(frame)
File "/usr/lib/python3.8/inspect.py", line 708, in getsourcefile
if getattr(getmodule(object, filename), '__loader__', None) is not None:
File "/usr/lib/python3.8/inspect.py", line 737, in getmodule
file = getabsfile(object, _filename)
File "/usr/lib/python3.8/inspect.py", line 721, in getabsfile
return os.path.normcase(os.path.abspath(_filename))
File "/usr/lib/python3.8/posixpath.py", line 379, in abspath
cwd = os.getcwd()
FileNotFoundError: [Errno 2] No such file or directory
>>>
Thanks for the report, crash typically refers to segfaults rather than exceptions being raised. Updated versions.
New changeset a459a81530de700b3d3faeb827b22ed1c9985812 by Irit Katriel in branch 'main': bpo-45406: make inspect.getmodule() return None when getabsfile() raises FileNotFoundError (GH-28824) https://github.com/python/cpython/commit/a459a81530de700b3d3faeb827b22ed1c9985812
New changeset cfdd7d26a72e7ae523039e40c11001c2d7ef36ba by Miss Islington (bot) in branch '3.10': bpo-45406: make inspect.getmodule() return None when getabsfile() raises FileNotFoundError (GH-28824) https://github.com/python/cpython/commit/cfdd7d26a72e7ae523039e40c11001c2d7ef36ba
New changeset 5f527caf15c52acc3f6e865721cdf781209f11ca by Miss Islington (bot) in branch '3.9': bpo-45406: make inspect.getmodule() return None when getabsfile() raises FileNotFoundError (GH-28824) https://github.com/python/cpython/commit/5f527caf15c52acc3f6e865721cdf781209f11ca
Thanks Lukasz.
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields: ```python assignee = None closed_at =
created_at =
labels = ['type-bug', 'library', '3.9', '3.10', '3.11']
title = 'inspect.getouterframes() tracebacks when $CWD does not exists'
updated_at =
user = 'https://bugs.python.org/msuchyredhatcom'
```
bugs.python.org fields:
```python
activity =
actor = 'iritkatriel'
assignee = 'none'
closed = True
closed_date =
closer = 'iritkatriel'
components = ['Library (Lib)']
creation =
creator = 'msuchy@redhat.com'
dependencies = []
files = []
hgrepos = []
issue_num = 45406
keywords = ['patch']
message_count = 7.0
messages = ['403410', '403461', '403491', '405560', '405563', '405565', '405567']
nosy_count = 5.0
nosy_names = ['lukasz.langa', 'msuchy@redhat.com', 'raulcd', 'miss-islington', 'iritkatriel']
pr_nums = ['28824', '29377', '29378']
priority = 'normal'
resolution = 'fixed'
stage = 'resolved'
status = 'closed'
superseder = None
type = 'behavior'
url = 'https://bugs.python.org/issue45406'
versions = ['Python 3.9', 'Python 3.10', 'Python 3.11']
```