python / cpython

The Python programming language
https://www.python.org
Other
63.37k stars 30.33k forks source link

inspect.getouterframes() tracebacks when $CWD does not exists #89569

Closed 0f1740dc-c717-4074-b009-75c706e553b2 closed 3 years ago

0f1740dc-c717-4074-b009-75c706e553b2 commented 3 years ago
BPO 45406
Nosy @ambv, @raulcd, @miss-islington, @iritkatriel
PRs
  • python/cpython#28824
  • python/cpython#29377
  • python/cpython#29378
  • 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'] ```

    0f1740dc-c717-4074-b009-75c706e553b2 commented 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
    3324b9cf-dbc3-4d7c-96b2-564050f451e9 commented 3 years ago

    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
    >>>
    iritkatriel commented 3 years ago

    Thanks for the report, crash typically refers to segfaults rather than exceptions being raised. Updated versions.

    ambv commented 3 years ago

    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

    miss-islington commented 3 years ago

    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

    miss-islington commented 3 years ago

    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

    iritkatriel commented 3 years ago

    Thanks Lukasz.