Skip to content

Commit 8e43fbf

Browse files
committed
python#9428: fix running scripts from profile/cProfile with their own name and the right namespace. Same fix as for trace.py in #1690103.
1 parent b1a97af commit 8e43fbf

File tree

3 files changed

+37
-21
lines changed

3 files changed

+37
-21
lines changed

Lib/cProfile.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def run(statement, filename=None, sort=-1):
3636
result = prof.print_stats(sort)
3737
return result
3838

39-
def runctx(statement, globals, locals, filename=None):
39+
def runctx(statement, globals, locals, filename=None, sort=-1):
4040
"""Run statement under profiler, supplying your own globals and locals,
4141
optionally saving results in filename.
4242
@@ -53,7 +53,7 @@ def runctx(statement, globals, locals, filename=None):
5353
if filename is not None:
5454
prof.dump_stats(filename)
5555
else:
56-
result = prof.print_stats()
56+
result = prof.print_stats(sort)
5757
return result
5858

5959
# ____________________________________________________________
@@ -164,7 +164,8 @@ def main():
164164
parser.add_option('-o', '--outfile', dest="outfile",
165165
help="Save stats to <outfile>", default=None)
166166
parser.add_option('-s', '--sort', dest="sort",
167-
help="Sort order when printing to stdout, based on pstats.Stats class", default=-1)
167+
help="Sort order when printing to stdout, based on pstats.Stats class",
168+
default=-1)
168169

169170
if not sys.argv[1:]:
170171
parser.print_usage()
@@ -173,14 +174,18 @@ def main():
173174
(options, args) = parser.parse_args()
174175
sys.argv[:] = args
175176

176-
if (len(sys.argv) > 0):
177-
sys.path.insert(0, os.path.dirname(sys.argv[0]))
178-
fp = open(sys.argv[0])
179-
try:
180-
script = fp.read()
181-
finally:
182-
fp.close()
183-
run('exec(%r)' % script, options.outfile, options.sort)
177+
if len(args) > 0:
178+
progname = args[0]
179+
sys.path.insert(0, os.path.dirname(progname))
180+
with open(progname, 'rb') as fp:
181+
code = compile(fp.read(), progname, 'exec')
182+
globs = {
183+
'__file__': progname,
184+
'__name__': '__main__',
185+
'__package__': None,
186+
'__cached__': None,
187+
}
188+
runctx(code, globs, None, options.outfile, options.sort)
184189
else:
185190
parser.print_usage()
186191
return parser

Lib/profile.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def run(statement, filename=None, sort=-1):
7575
else:
7676
return prof.print_stats(sort)
7777

78-
def runctx(statement, globals, locals, filename=None):
78+
def runctx(statement, globals, locals, filename=None, sort=-1):
7979
"""Run statement under profiler, supplying your own globals and locals,
8080
optionally saving results in filename.
8181
@@ -90,7 +90,7 @@ def runctx(statement, globals, locals, filename=None):
9090
if filename is not None:
9191
prof.dump_stats(filename)
9292
else:
93-
return prof.print_stats()
93+
return prof.print_stats(sort)
9494

9595
if hasattr(os, "times"):
9696
def _get_time_times(timer=os.times):
@@ -582,20 +582,28 @@ def main():
582582
parser.add_option('-o', '--outfile', dest="outfile",
583583
help="Save stats to <outfile>", default=None)
584584
parser.add_option('-s', '--sort', dest="sort",
585-
help="Sort order when printing to stdout, based on pstats.Stats class", default=-1)
585+
help="Sort order when printing to stdout, based on pstats.Stats class",
586+
default=-1)
586587

587588
if not sys.argv[1:]:
588589
parser.print_usage()
589590
sys.exit(2)
590591

591592
(options, args) = parser.parse_args()
592-
593-
if (len(args) > 0):
594-
sys.argv[:] = args
595-
sys.path.insert(0, os.path.dirname(sys.argv[0]))
596-
with open(sys.argv[0], 'rb') as fp:
597-
script = fp.read()
598-
run('exec(%r)' % script, options.outfile, options.sort)
593+
sys.argv[:] = args
594+
595+
if len(args) > 0:
596+
progname = args[0]
597+
sys.path.insert(0, os.path.dirname(progname))
598+
with open(progname, 'rb') as fp:
599+
code = compile(fp.read(), progname, 'exec')
600+
globs = {
601+
'__file__': progname,
602+
'__name__': '__main__',
603+
'__package__': None,
604+
'__cached__': None,
605+
}
606+
runctx(code, globs, None, options.outfile, options.sort)
599607
else:
600608
parser.print_usage()
601609
return parser

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ Extensions
2929
Library
3030
-------
3131

32+
- Issue #9428: Fix running scripts with the profile/cProfile modules from
33+
the command line.
34+
3235
- Issue #7781: Fix restricting stats by entry counts in the pstats
3336
interactive browser.
3437

0 commit comments

Comments
 (0)