diff options
author | Andrey Bienkowski <hexagonrecursion@gmail.com> | 2021-01-25 21:08:41 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-25 21:08:41 (GMT) |
commit | f2df7958fb82cd927e17152b3a1bd2823a76dd3e (patch) | |
tree | 479d20b945b7767925685b5753e27a8227c72022 | |
parent | 26af2fae189629d22a87aaf01b92d6f4de92b958 (diff) | |
download | cpython-f2df7958fb82cd927e17152b3a1bd2823a76dd3e.zip cpython-f2df7958fb82cd927e17152b3a1bd2823a76dd3e.tar.gz cpython-f2df7958fb82cd927e17152b3a1bd2823a76dd3e.tar.bz2 |
[3.9] bpo-42384: pdb: correctly populate sys.path[0] (GH-23338) (#24321)
-rwxr-xr-x | Lib/pdb.py | 3 | ||||
-rw-r--r-- | Lib/test/test_pdb.py | 42 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst | 1 |
3 files changed, 45 insertions, 1 deletions
@@ -1686,8 +1686,9 @@ def main(): sys.argv[:] = args # Hide "pdb.py" and pdb options from argument list - # Replace pdb's dir with script's dir in front of module search path. if not run_as_module: + mainpyfile = os.path.realpath(mainpyfile) + # Replace pdb's dir with script's dir in front of module search path. sys.path[0] = os.path.dirname(mainpyfile) # Note on saving/restoring sys.argv: it's a good idea when sys.argv was diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 8016f81..e1a13cb 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -1661,6 +1661,48 @@ def bœr(): '(Pdb) ', ]) + + def test_issue42384(self): + '''When running `python foo.py` sys.path[0] is an absolute path. `python -m pdb foo.py` should behave the same''' + script = textwrap.dedent(""" + import sys + print('sys.path[0] is', sys.path[0]) + """) + commands = 'c\nq' + + with support.temp_cwd() as cwd: + expected = f'(Pdb) sys.path[0] is {os.path.realpath(cwd)}' + + stdout, stderr = self.run_pdb_script(script, commands) + + self.assertEqual(stdout.split('\n')[2].rstrip('\r'), expected) + + @support.skip_unless_symlink + def test_issue42384_symlink(self): + '''When running `python foo.py` sys.path[0] resolves symlinks. `python -m pdb foo.py` should behave the same''' + script = textwrap.dedent(""" + import sys + print('sys.path[0] is', sys.path[0]) + """) + commands = 'c\nq' + + with support.temp_cwd() as cwd: + cwd = os.path.realpath(cwd) + dir_one = os.path.join(cwd, 'dir_one') + dir_two = os.path.join(cwd, 'dir_two') + expected = f'(Pdb) sys.path[0] is {dir_one}' + + os.mkdir(dir_one) + with open(os.path.join(dir_one, 'foo.py'), 'w') as f: + f.write(script) + os.mkdir(dir_two) + os.symlink(os.path.join(dir_one, 'foo.py'), os.path.join(dir_two, 'foo.py')) + + stdout, stderr = self._run_pdb([os.path.join('dir_two', 'foo.py')], commands) + + self.assertEqual(stdout.split('\n')[2].rstrip('\r'), expected) + + def load_tests(*args): from test import test_pdb suites = [ diff --git a/Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst b/Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst new file mode 100644 index 0000000..ae99016 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst @@ -0,0 +1 @@ +Make pdb populate sys.path[0] exactly the same as regular python execution. |