22import sys
33import os
44import codecs
5+ import runpy
56from pyinstrument import Profiler
67from pyinstrument .profiler import get_recorder_class , get_renderer_class
78from .six import exec_
@@ -44,17 +45,31 @@ def main():
4445 dest = 'color' , action = 'store_false' ,
4546 help = 'force no color text output' )
4647
48+ parser .add_option ('-m' , '' ,
49+ dest = 'module_name' , action = 'store' ,
50+ help = 'searches sys.path for the named module and runs the corresponding .py file as a script.' )
51+
4752 if not sys .argv [1 :]:
4853 parser .print_help ()
4954 sys .exit (2 )
5055
51- (options , args ) = parser .parse_args ()
56+ options , args = parser .parse_args ()
57+
58+ if args == [] and options .module_name is None :
59+ parser .print_help ()
60+ sys .exit (2 )
61+
5262 sys .argv [:] = args
5363
54- if len (args ) > 0 :
64+ if options .module_name is not None :
65+ code = "run_module(modname, run_name='__main__')"
66+ globs = {
67+ 'run_module' : runpy .run_module ,
68+ 'modname' : options .module_name
69+ }
70+ else :
5571 progname = args [0 ]
5672 sys .path .insert (0 , os .path .dirname (progname ))
57-
5873 with open (progname , 'rb' ) as fp :
5974 code = compile (fp .read (), progname , 'exec' )
6075 globs = {
@@ -63,45 +78,43 @@ def main():
6378 '__package__' : None ,
6479 }
6580
66- if options .output_renderer :
67- renderer = options .output_renderer
68- elif options .output_html :
69- renderer = 'html'
70- else :
71- renderer = 'text'
81+ if options .output_renderer :
82+ renderer = options .output_renderer
83+ elif options .output_html :
84+ renderer = 'html'
85+ else :
86+ renderer = 'text'
7287
73- recorder = get_renderer_class (renderer ).preferred_recorder
88+ recorder = get_renderer_class (renderer ).preferred_recorder
7489
75- profiler = Profiler (recorder = recorder )
90+ profiler = Profiler (recorder = recorder )
7691
77- profiler .start ()
92+ profiler .start ()
7893
79- try :
80- exec_ (code , globs , None )
81- except (SystemExit , KeyboardInterrupt ):
82- pass
94+ try :
95+ exec_ (code , globs , None )
96+ except (SystemExit , KeyboardInterrupt ):
97+ pass
8398
84- profiler .stop ()
99+ profiler .stop ()
85100
86- if options .outfile :
87- f = codecs .open (options .outfile , 'w' , 'utf-8' )
88- else :
89- f = sys .stdout
101+ if options .outfile :
102+ f = codecs .open (options .outfile , 'w' , 'utf-8' )
103+ else :
104+ f = sys .stdout
90105
91- renderer_kwargs = {}
106+ renderer_kwargs = {}
92107
93- if renderer == 'text' :
94- unicode_override = options .unicode != None
95- color_override = options .color != None
96- unicode = options .unicode if unicode_override else file_supports_unicode (f )
97- color = options .color if color_override else file_supports_color (f )
98-
99- renderer_kwargs = {'unicode' : unicode , 'color' : color }
108+ if renderer == 'text' :
109+ unicode_override = options .unicode != None
110+ color_override = options .color != None
111+ unicode = options .unicode if unicode_override else file_supports_unicode (f )
112+ color = options .color if color_override else file_supports_color (f )
113+
114+ renderer_kwargs = {'unicode' : unicode , 'color' : color }
100115
101- f .write (profiler .output (renderer = renderer , ** renderer_kwargs ))
102- f .close ()
103- else :
104- parser .print_usage ()
116+ f .write (profiler .output (renderer = renderer , ** renderer_kwargs ))
117+ f .close ()
105118
106119
107120def file_supports_color (file_obj ):
0 commit comments