From 5d032c0f95d4794edcf38253aa54a0e970e5249b Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Thu, 17 Nov 2011 18:03:24 -0500 Subject: [PATCH] PDB now will properly escape backslashes in the names of modules it executes. Fixes #7750 --- Lib/pdb.py | 2 +- Lib/test/test_pdb.py | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Lib/pdb.py b/Lib/pdb.py index a6109d45e84..5468d3fcaff 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1229,7 +1229,7 @@ see no sign that the breakpoint was reached. self._wait_for_mainpyfile = 1 self.mainpyfile = self.canonic(filename) self._user_requested_quit = 0 - statement = 'execfile( "%s")' % filename + statement = 'execfile(%r)' % filename self.run(statement) # Simplified interface diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index f03c20bcf9c..5b1f8f792a5 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -3,6 +3,9 @@ import imp import sys +import os +import unittest +import subprocess from test import test_support # This little helper class is essential for testing pdb under doctest. @@ -277,6 +280,29 @@ def test_pdb_continue_in_bottomframe(): 4 """ +class Tester7750(unittest.TestCase): + # if the filename has something that resolves to a python + # escape character (such as \t), it will fail + test_fn = '.\\test7750.py' + + msg = "issue7750 only applies when os.sep is a backslash" + @unittest.skipUnless(os.path.sep == '\\', msg) + def test_issue7750(self): + with open(self.test_fn, 'w') as f: + f.write('print("hello world")') + cmd = [sys.executable, '-m', 'pdb', self.test_fn,] + proc = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.STDOUT, + ) + stdout, stderr = proc.communicate('quit\n') + self.assertNotIn('IOError', stdout, "pdb munged the filename") + + def tearDown(self): + if os.path.isfile(self.test_fn): + os.remove(self.test_fn) + def test_main(): from test import test_pdb @@ -285,3 +311,4 @@ def test_main(): if __name__ == '__main__': test_main() + unittest.main()