I'd like to print every line of python script as it's being executed, as well as the log from the console as every line is being executed.
For example, for this script:
import time
print 'hello'
time.sleep(3)
print 'goodbye'
I'd like it to generate the following in the console:
line 1: import time
line 2: print 'hello'
hello
line 3: time.sleep(3)
line 4: print 'goodbye'
goodbye
See below for my attempt
import subprocess as subp
python_string = """
import sys
import inspect
class SetTrace(object):
def __init__(self, func):
self.func = func
def __enter__(self):
sys.settrace(self.func)
return self
def __exit__(self, ext_type, exc_value, traceback):
sys.settrace(None)
def monitor(frame, event, arg):
if event == "line":
file_dict = dict(enumerate("{}".split("|")))
line_number = frame.f_lineno-25
if line_number > 0:
print "line " + str(line_number)+ ": " + file_dict[line_number]
return monitor
def run():
{}
with SetTrace(monitor):
run()
"""
python_string_example = """
import time
print 'hello'
time.sleep(3)
print 'goodbye'
"""
python_string = python_string.format("|".join([i.strip() for i in python_string_example.split("\n")]),python_string_example)
proc = subp.Popen(['python', '-'], stdin=subp.PIPE,stdout=subp.PIPE, stderr=subp.STDOUT)
proc.stdin.write(python_string)
proc.stdin.close()
for line in proc.stdout:
print '{}'.format(line.strip())
proc.wait()
Although, this produces the desired result, it produces the output after the entire script is executed. It also is a very bad hack since it will most likely break depending on what python_string_base is
You can use the trace module for this
If your 4 lines of code are in tmp.py, calling it as
python -m trace -t tmp.py
Produces the following output
--- modulename: tmp, funcname: <module>
tmp.py(1): import time
tmp.py(2): print 'hello'
hello
tmp.py(3): time.sleep(3)
tmp.py(4): print 'goodbye'
goodbye
--- modulename: trace, funcname: _unsettrace
trace.py(80): sys.settrace(None)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With