@@ -666,7 +666,9 @@ def main():
666666 help = 'Ignore files in the given directory '
667667 '(multiple directories can be joined by os.pathsep).' )
668668
669- parser .add_argument ('filename' , nargs = '?' ,
669+ parser .add_argument ('--module' , action = 'store_true' , default = False ,
670+ help = 'Trace a module. ' )
671+ parser .add_argument ('progname' , nargs = '?' ,
670672 help = 'file to run as main program' )
671673 parser .add_argument ('arguments' , nargs = argparse .REMAINDER ,
672674 help = 'arguments to the program' )
@@ -704,26 +706,40 @@ def parse_ignore_dir(s):
704706 if opts .summary and not opts .count :
705707 parser .error ('--summary can only be used with --count or --report' )
706708
707- if opts .filename is None :
708- parser .error ('filename is missing: required with the main options' )
709-
710- sys .argv = [opts .filename , * opts .arguments ]
711- sys .path [0 ] = os .path .dirname (opts .filename )
709+ if opts .progname is None :
710+ parser .error ('progname is missing: required with the main options' )
712711
713712 t = Trace (opts .count , opts .trace , countfuncs = opts .listfuncs ,
714713 countcallers = opts .trackcalls , ignoremods = opts .ignore_module ,
715714 ignoredirs = opts .ignore_dir , infile = opts .file ,
716715 outfile = opts .file , timing = opts .timing )
717716 try :
718- with open (opts .filename ) as fp :
719- code = compile (fp .read (), opts .filename , 'exec' )
720- # try to emulate __main__ namespace as much as possible
721- globs = {
722- '__file__' : opts .filename ,
723- '__name__' : '__main__' ,
724- '__package__' : None ,
725- '__cached__' : None ,
726- }
717+ if opts .module :
718+ import runpy
719+ module_name = opts .progname
720+ mod_name , mod_spec , code = runpy ._get_module_details (module_name )
721+ sys .argv = [code .co_filename , * opts .arguments ]
722+ globs = {
723+ '__name__' : '__main__' ,
724+ '__file__' : code .co_filename ,
725+ '__package__' : mod_spec .parent ,
726+ '__loader__' : mod_spec .loader ,
727+ '__spec__' : mod_spec ,
728+ '__cached__' : None ,
729+ }
730+ else :
731+ sys .argv = [opts .progname , * opts .arguments ]
732+ sys .path [0 ] = os .path .dirname (opts .progname )
733+
734+ with open (opts .progname ) as fp :
735+ code = compile (fp .read (), opts .progname , 'exec' )
736+ # try to emulate __main__ namespace as much as possible
737+ globs = {
738+ '__file__' : opts .progname ,
739+ '__name__' : '__main__' ,
740+ '__package__' : None ,
741+ '__cached__' : None ,
742+ }
727743 t .runctx (code , globs , globs )
728744 except OSError as err :
729745 sys .exit ("Cannot run file %r because: %s" % (sys .argv [0 ], err ))
0 commit comments