Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions Lib/pdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,10 @@ def check(self):
print('Error:', self.orig, 'is a directory')
sys.exit(1)

# Replace pdb's dir with script's dir in front of module search path.
sys.path[0] = os.path.dirname(self)
# If safe_path(-P) is not set, sys.path[0] would be the directory
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# If safe_path(-P) is not set, sys.path[0] would be the directory
# If safe_path (-P) is not selected, sys.path[0] would be the directory

Comment thread
gaogaotiantian marked this conversation as resolved.
Outdated
# of pdb, and we should replace it with the directory of the script
if not sys.flags.safe_path:
sys.path[0] = os.path.dirname(self)

@property
def filename(self):
Expand Down
33 changes: 29 additions & 4 deletions Lib/test/test_pdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -2493,15 +2493,21 @@ def tearDown(self):

@unittest.skipIf(sys.flags.safe_path,
'PYTHONSAFEPATH changes default sys.path')
def _run_pdb(self, pdb_args, commands, expected_returncode=0):
def _run_pdb(self, pdb_args, commands,
expected_returncode=0,
extra_env=None):
self.addCleanup(os_helper.rmtree, '__pycache__')
cmd = [sys.executable, '-m', 'pdb'] + pdb_args
if extra_env is not None:
env = os.environ | extra_env
else:
env = os.environ
with subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
stderr=subprocess.STDOUT,
env = {**os.environ, 'PYTHONIOENCODING': 'utf-8'}
env = {**env, 'PYTHONIOENCODING': 'utf-8'}
) as proc:
stdout, stderr = proc.communicate(str.encode(commands))
stdout = stdout and bytes.decode(stdout)
Expand All @@ -2513,13 +2519,15 @@ def _run_pdb(self, pdb_args, commands, expected_returncode=0):
)
return stdout, stderr

def run_pdb_script(self, script, commands, expected_returncode=0):
def run_pdb_script(self, script, commands,
expected_returncode=0,
extra_env=None):
"""Run 'script' lines with pdb and the pdb 'commands'."""
filename = 'main.py'
with open(filename, 'w') as f:
f.write(textwrap.dedent(script))
self.addCleanup(os_helper.unlink, filename)
return self._run_pdb([filename], commands, expected_returncode)
return self._run_pdb([filename], commands, expected_returncode, extra_env)

def run_pdb_module(self, script, commands):
"""Runs the script code as part of a module"""
Expand Down Expand Up @@ -3104,6 +3112,23 @@ def test_issue42384_symlink(self):

self.assertEqual(stdout.split('\n')[2].rstrip('\r'), expected)

def test_safe_path(self):
""" With safe_path set, pdb should not mangle sys.path[0]"""

script = textwrap.dedent("""
import sys
import random
print('sys.path[0] is', sys.path[0])
""")
commands = 'c\n'


with os_helper.temp_cwd() as cwd:
stdout, _ = self.run_pdb_script(script, commands, extra_env={'PYTHONSAFEPATH': '1'})

unexpected = f'sys.path[0] is {os.path.realpath(cwd)}'
self.assertNotIn(unexpected, stdout)
Comment thread
iritkatriel marked this conversation as resolved.

def test_issue42383(self):
with os_helper.temp_cwd() as cwd:
with open('foo.py', 'w') as f:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Do not mangle ``sys.path[0]`` in :mod:`pdb` if safe_path is set