summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Bienkowski <hexagonrecursion@gmail.com>2021-01-25 21:10:40 (GMT)
committerGitHub <noreply@github.com>2021-01-25 21:10:40 (GMT)
commitc10180ea1458aa0ffd7793cb75629ebffe8a257e (patch)
treeaccda02430e44c1a223d90c9324413ed0ba2382d
parent7370be30017f81d2f41f1b4b2abf31dd9a3f8fb1 (diff)
downloadcpython-c10180ea1458aa0ffd7793cb75629ebffe8a257e.zip
cpython-c10180ea1458aa0ffd7793cb75629ebffe8a257e.tar.gz
cpython-c10180ea1458aa0ffd7793cb75629ebffe8a257e.tar.bz2
[3.8] bpo-42384: pdb: correctly populate sys.path[0] (GH-23338) (#24320)
-rwxr-xr-xLib/pdb.py3
-rw-r--r--Lib/test/test_pdb.py42
-rw-r--r--Misc/NEWS.d/next/Library/2020-11-17-14-32-39.bpo-42384.1ZnQSn.rst1
3 files changed, 45 insertions, 1 deletions
diff --git a/Lib/pdb.py b/Lib/pdb.py
index d7d95715..7a5192c 100755
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -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 9c9471a..7444874 100644
--- a/Lib/test/test_pdb.py
+++ b/Lib/test/test_pdb.py
@@ -1658,6 +1658,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.