Skip to content

Commit 8578459

Browse files
authored
Merge pull request #45 from iddan/master
Support running modules
2 parents eda4731 + 668b812 commit 8578459

File tree

3 files changed

+48
-36
lines changed

3 files changed

+48
-36
lines changed

pyinstrument/__main__.py

Lines changed: 46 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import sys
33
import os
44
import codecs
5+
import runpy
56
from pyinstrument import Profiler
67
from pyinstrument.profiler import get_recorder_class, get_renderer_class
78
from .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

107120
def file_supports_color(file_obj):

test/__init__.py

Whitespace-only changes.

test/test_cmdline.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@ def test_command_line():
99
assert 'busy_wait' in str(output)
1010
assert 'do_nothing' in str(output)
1111

12-
@pytest.mark.xfail
1312
def test_module_running():
14-
working_dir = os.path.dirname(__file__)
13+
working_dir = os.path.normpath(os.path.join(os.path.dirname(__file__), '..'))
1514
output = subprocess.check_output(
16-
[sys.executable, '-m', 'pyinstrument', '-m', 'busywait_module'],
15+
[sys.executable, '-m', 'pyinstrument', '-m', 'test.busywait_module'],
1716
cwd=working_dir
1817
)
1918

0 commit comments

Comments
 (0)