diff options
| -rwxr-xr-x | Lib/cProfile.py | 21 | ||||
| -rwxr-xr-x | Lib/profile.py | 25 | ||||
| -rwxr-xr-x | Lib/test/regrtest.py | 8 | ||||
| -rw-r--r-- | Misc/NEWS | 8 |
4 files changed, 46 insertions, 16 deletions
diff --git a/Lib/cProfile.py b/Lib/cProfile.py index 19d5804..b2efd04 100755 --- a/Lib/cProfile.py +++ b/Lib/cProfile.py @@ -36,7 +36,7 @@ def run(statement, filename=None, sort=-1): result = prof.print_stats(sort) return result -def runctx(statement, globals, locals, filename=None): +def runctx(statement, globals, locals, filename=None, sort=-1): """Run statement under profiler, supplying your own globals and locals, optionally saving results in filename. @@ -53,7 +53,7 @@ def runctx(statement, globals, locals, filename=None): if filename is not None: prof.dump_stats(filename) else: - result = prof.print_stats() + result = prof.print_stats(sort) return result # Backwards compatibility. @@ -169,7 +169,8 @@ def main(): parser.add_option('-o', '--outfile', dest="outfile", help="Save stats to <outfile>", default=None) parser.add_option('-s', '--sort', dest="sort", - help="Sort order when printing to stdout, based on pstats.Stats class", default=-1) + help="Sort order when printing to stdout, based on pstats.Stats class", + default=-1) if not sys.argv[1:]: parser.print_usage() @@ -178,9 +179,17 @@ def main(): (options, args) = parser.parse_args() sys.argv[:] = args - if (len(sys.argv) > 0): - sys.path.insert(0, os.path.dirname(sys.argv[0])) - run('execfile(%r)' % (sys.argv[0],), options.outfile, options.sort) + if len(args) > 0: + progname = args[0] + sys.path.insert(0, os.path.dirname(progname)) + with open(progname, 'rb') as fp: + code = compile(fp.read(), progname, 'exec') + globs = { + '__file__': progname, + '__name__': '__main__', + '__package__': None, + } + runctx(code, globs, None, options.outfile, options.sort) else: parser.print_usage() return parser diff --git a/Lib/profile.py b/Lib/profile.py index 9a4336e..2d1f486 100755 --- a/Lib/profile.py +++ b/Lib/profile.py @@ -75,7 +75,7 @@ def run(statement, filename=None, sort=-1): else: return prof.print_stats(sort) -def runctx(statement, globals, locals, filename=None): +def runctx(statement, globals, locals, filename=None, sort=-1): """Run statement under profiler, supplying your own globals and locals, optionally saving results in filename. @@ -90,7 +90,7 @@ def runctx(statement, globals, locals, filename=None): if filename is not None: prof.dump_stats(filename) else: - return prof.print_stats() + return prof.print_stats(sort) # Backwards compatibility. def help(): @@ -589,18 +589,27 @@ def main(): parser.add_option('-o', '--outfile', dest="outfile", help="Save stats to <outfile>", default=None) parser.add_option('-s', '--sort', dest="sort", - help="Sort order when printing to stdout, based on pstats.Stats class", default=-1) + help="Sort order when printing to stdout, based on pstats.Stats class", + default=-1) if not sys.argv[1:]: parser.print_usage() sys.exit(2) (options, args) = parser.parse_args() - - if (len(args) > 0): - sys.argv[:] = args - sys.path.insert(0, os.path.dirname(sys.argv[0])) - run('execfile(%r)' % (sys.argv[0],), options.outfile, options.sort) + sys.argv[:] = args + + if len(args) > 0: + progname = args[0] + sys.path.insert(0, os.path.dirname(progname)) + with open(progname, 'rb') as fp: + code = compile(fp.read(), progname, 'exec') + globs = { + '__file__': progname, + '__name__': '__main__', + '__package__': None, + } + runctx(code, globs, None, options.outfile, options.sort) else: parser.print_usage() return parser diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index cd7bc48..fc0e823 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -1501,7 +1501,13 @@ class _ExpectedSkips: return self.expected if __name__ == '__main__': - # Simplification for findtestdir(). + # findtestdir() gets the dirname out of __file__, so we have to make it + # absolute before changing the working directory. + # For example __file__ may be relative when running trace or profile. + # See issue #9323. + __file__ = os.path.abspath(__file__) + + # sanity check assert __file__ == os.path.abspath(sys.argv[0]) # When tests are run from the Python build directory, it is best practice @@ -151,6 +151,9 @@ Library - Issue #9354: Provide getsockopt() in asyncore's file_wrapper. +- Issue #9428: Fix running scripts with the profile/cProfile modules from + the command line. + - Issue #7781: Fix restricting stats by entry counts in the pstats interactive browser. @@ -340,8 +343,11 @@ Build Tests ----- +- Issue #9323: Make test.regrtest.__file__ absolute, this was not always the + case when running profile or trace, for example. + - Issue #9315: Added tests for the trace module. Patch by Eli Bendersky. - + - Strengthen test_unicode with explicit type checking for assertEqual tests. - Issue #8857: Provide a test case for socket.getaddrinfo. |
