diff options
author | Georg Brandl <georg@python.org> | 2010-08-02 12:20:23 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2010-08-02 12:20:23 (GMT) |
commit | 8e43fbfffa38b36e907bb847f5d09b3a9bc1bcb4 (patch) | |
tree | 6b57a091cf25070ed6b98e97c425ac01eb8536bd | |
parent | b1a97afadb5d6100613c19409882eba0be991b41 (diff) | |
download | cpython-8e43fbfffa38b36e907bb847f5d09b3a9bc1bcb4.zip cpython-8e43fbfffa38b36e907bb847f5d09b3a9bc1bcb4.tar.gz cpython-8e43fbfffa38b36e907bb847f5d09b3a9bc1bcb4.tar.bz2 |
#9428: fix running scripts from profile/cProfile with their own name and the right namespace. Same fix as for trace.py in #1690103.
-rwxr-xr-x | Lib/cProfile.py | 27 | ||||
-rwxr-xr-x | Lib/profile.py | 28 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
3 files changed, 37 insertions, 21 deletions
diff --git a/Lib/cProfile.py b/Lib/cProfile.py index 3e2b2ed..c24d45b 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 # ____________________________________________________________ @@ -164,7 +164,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() @@ -173,14 +174,18 @@ 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])) - fp = open(sys.argv[0]) - try: - script = fp.read() - finally: - fp.close() - run('exec(%r)' % script, 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, + '__cached__': 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 0255bba..d6511b71 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) if hasattr(os, "times"): def _get_time_times(timer=os.times): @@ -582,20 +582,28 @@ 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])) - with open(sys.argv[0], 'rb') as fp: - script = fp.read() - run('exec(%r)' % script, 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, + '__cached__': None, + } + runctx(code, globs, None, options.outfile, options.sort) else: parser.print_usage() return parser @@ -29,6 +29,9 @@ Extensions Library ------- +- 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. |