Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 53 additions & 42 deletions pyinstrument/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import codecs
from pyinstrument import Profiler
from pyinstrument.profiler import get_recorder_class, get_renderer_class
from importlib.util import find_spec
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can't find documentation for this on 2.7.... running on Python 2.7 gives me this:

Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/Users/joerick/04-Open-source-projects/pyinstrument/pyinstrument/__main__.py", line 7, in <module>
    from importlib.util import find_spec
ImportError: No module named util

Might need a polyfill for Python 2?

from .six import exec_


Expand Down Expand Up @@ -44,64 +45,74 @@ def main():
dest='color', action='store_false',
help='force no color text output')

parser.add_option('-m', '',
dest='module_name', action='store',
help='searches sys.path for the named module and runs the corresponding .py file as a script.')

if not sys.argv[1:]:
parser.print_help()
sys.exit(2)

(options, args) = parser.parse_args()
sys.argv[:] = args
options, args = parser.parse_args()

if len(args) > 0:
progname = args[0]
sys.path.insert(0, os.path.dirname(progname))
if args == [] and options.module_name is None:
parser.print_help()
sys.exit(2)

with open(progname, 'rb') as fp:
code = compile(fp.read(), progname, 'exec')
globs = {
'__file__': progname,
'__name__': '__main__',
'__package__': None,
}
sys.argv[:] = args

if options.output_renderer:
renderer = options.output_renderer
elif options.output_html:
renderer = 'html'
else:
renderer = 'text'
if options.module_name is not None:
progname = find_spec(options.module_name).origin
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure this is right - when I run find_spec('pyinstrument').origin in a shell it gives me the __init__.py file. It should be running the __main__.py file as I understand it.

The cProfile module uses runpy for this - it's probably best to copy that.

else:
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,
}

if options.output_renderer:
renderer = options.output_renderer
elif options.output_html:
renderer = 'html'
else:
renderer = 'text'

recorder = get_renderer_class(renderer).preferred_recorder
recorder = get_renderer_class(renderer).preferred_recorder

profiler = Profiler(recorder=recorder)
profiler = Profiler(recorder=recorder)

profiler.start()
profiler.start()

try:
exec_(code, globs, None)
except (SystemExit, KeyboardInterrupt):
pass
try:
exec_(code, globs, None)
except (SystemExit, KeyboardInterrupt):
pass

profiler.stop()
profiler.stop()

if options.outfile:
f = codecs.open(options.outfile, 'w', 'utf-8')
else:
f = sys.stdout
if options.outfile:
f = codecs.open(options.outfile, 'w', 'utf-8')
else:
f = sys.stdout

renderer_kwargs = {}
renderer_kwargs = {}

if renderer == 'text':
unicode_override = options.unicode != None
color_override = options.color != None
unicode = options.unicode if unicode_override else file_supports_unicode(f)
color = options.color if color_override else file_supports_color(f)
renderer_kwargs = {'unicode': unicode, 'color': color}
if renderer == 'text':
unicode_override = options.unicode != None
color_override = options.color != None
unicode = options.unicode if unicode_override else file_supports_unicode(f)
color = options.color if color_override else file_supports_color(f)

renderer_kwargs = {'unicode': unicode, 'color': color}

f.write(profiler.output(renderer=renderer, **renderer_kwargs))
f.close()
else:
parser.print_usage()
f.write(profiler.output(renderer=renderer, **renderer_kwargs))
f.close()


def file_supports_color(file_obj):
Expand Down