8 votes

Comment imprimer chaque ligne d'un script python au fur et à mesure de son exécution (y compris dans la console) ?

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

17voto

user13107 Points 471

Vous pouvez utiliser le module de traçage pour cette

Si vos 4 lignes de code sont dans tmp.py, l'appeler en tant que

python -m trace -t tmp.py 

Le résultat est le suivant

 --- 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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X