[Python-checkins] bpo-40492: Fix --outfile with relative path when the program changes it working dir (GH-19910)

Anthony Sottile webhook-mailer at python.org
Sun Oct 18 16:48:39 EDT 2020


https://github.com/python/cpython/commit/3c0ac18504cfeed822439024339d5717f42bdd66
commit: 3c0ac18504cfeed822439024339d5717f42bdd66
branch: master
author: Anthony Sottile <asottile at umich.edu>
committer: GitHub <noreply at github.com>
date: 2020-10-18T23:48:31+03:00
summary:

bpo-40492: Fix --outfile with relative path when the program changes it working dir (GH-19910)

files:
A Misc/NEWS.d/next/Library/2020-05-04-12-16-00.bpo-40492.ONk9Na.rst
M Lib/cProfile.py
M Lib/profile.py
M Lib/test/test_profile.py

diff --git a/Lib/cProfile.py b/Lib/cProfile.py
index 4f202038d6126..59b4699feb506 100755
--- a/Lib/cProfile.py
+++ b/Lib/cProfile.py
@@ -152,6 +152,11 @@ def main():
     (options, args) = parser.parse_args()
     sys.argv[:] = args
 
+    # The script that we're profiling may chdir, so capture the absolute path
+    # to the output file at startup.
+    if options.outfile is not None:
+        options.outfile = os.path.abspath(options.outfile)
+
     if len(args) > 0:
         if options.module:
             code = "run_module(modname, run_name='__main__')"
diff --git a/Lib/profile.py b/Lib/profile.py
index aad458dc951f4..5cb017ed83009 100755
--- a/Lib/profile.py
+++ b/Lib/profile.py
@@ -571,6 +571,11 @@ def main():
     (options, args) = parser.parse_args()
     sys.argv[:] = args
 
+    # The script that we're profiling may chdir, so capture the absolute path
+    # to the output file at startup.
+    if options.outfile is not None:
+        options.outfile = os.path.abspath(options.outfile)
+
     if len(args) > 0:
         if options.module:
             import runpy
diff --git a/Lib/test/test_profile.py b/Lib/test/test_profile.py
index 738be85bedf3c..1bdf30acbb54b 100644
--- a/Lib/test/test_profile.py
+++ b/Lib/test/test_profile.py
@@ -7,7 +7,7 @@
 from difflib import unified_diff
 from io import StringIO
 from test.support import run_unittest
-from test.support.os_helper import TESTFN, unlink
+from test.support.os_helper import TESTFN, unlink, temp_dir, change_cwd
 from contextlib import contextmanager
 
 import profile
@@ -112,6 +112,20 @@ def test_run_profile_as_module(self):
         assert_python_ok('-m', self.profilermodule.__name__,
                          '-m', 'timeit', '-n', '1')
 
+    def test_output_file_when_changing_directory(self):
+        with temp_dir() as tmpdir, change_cwd(tmpdir):
+            os.mkdir('dest')
+            with open('demo.py', 'w') as f:
+                f.write('import os; os.chdir("dest")')
+
+            assert_python_ok(
+                '-m', self.profilermodule.__name__,
+                '-o', 'out.pstats',
+                'demo.py',
+            )
+
+            self.assertTrue(os.path.exists('out.pstats'))
+
 
 def regenerate_expected_output(filename, cls):
     filename = filename.rstrip('co')
diff --git a/Misc/NEWS.d/next/Library/2020-05-04-12-16-00.bpo-40492.ONk9Na.rst b/Misc/NEWS.d/next/Library/2020-05-04-12-16-00.bpo-40492.ONk9Na.rst
new file mode 100644
index 0000000000000..86bc08c79e21e
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-05-04-12-16-00.bpo-40492.ONk9Na.rst
@@ -0,0 +1,3 @@
+Fix ``--outfile`` for :mod:`cProfile` / :mod:`profile` not writing the output
+file in the original directory when the program being profiled changes the
+working directory.  PR by Anthony Sottile.



More information about the Python-checkins mailing list