J'aimerais imprimer chaque ligne de python script lors de son exécution, ainsi que le journal de la console lors de l'exécution de chaque ligne.
Par exemple, pour ce script :
import time
print 'hello'
time.sleep(3)
print 'goodbye'
Je voudrais qu'il génère ce qui suit dans la console :
line 1: import time
line 2: print 'hello'
hello
line 3: time.sleep(3)
line 4: print 'goodbye'
goodbye
Voir ci-dessous pour ma tentative
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()
Bien que cela produise le résultat souhaité, cela produit la sortie après que le script entier soit exécuté. C'est également un très mauvais hack puisqu'il sera très probablement cassé en fonction de ce que python_string_base est