Пожалуйста, предложите команду Python, которая эквивалентна set -x
в сценариях оболочки.
Есть ли способ распечатать/записать каждую строку исходного файла, выполненную Python?
Пожалуйста, предложите команду Python, которая эквивалентна set -x
в сценариях оболочки.
Есть ли способ распечатать/записать каждую строку исходного файла, выполненную Python?
Вы можете использовать модуль trace:
python -m trace -t your_script.py
В приведенной выше командной строке будет отображаться каждая строка кода по мере ее выполнения.
чтобы получить правильный эквивалент bash -x
с помощью модуля trace
, нужно использовать --ignore-dir
, чтобы заблокировать печать исходных строк каждого импортированного модуля, например. python -m trace --trace --ignore-dir /usr/lib/python2.7 --ignore-dir /usr/lib/pymodules repost.py
, добавив дополнительные директивы --ignore-dir
, если это необходимо для других мест расположения модулей.
это становится важным при попытке найти модули медленной загрузки, такие как requests
, которые выдают миллионы строк исходного кода в течение нескольких минут на медленной машине. правильное использование --ignore-dir
сокращает время до нескольких секунд и отображает только строки из вашего собственного кода.
$ time python -m trace --trace repost.py 2>&1 | wc
3710176 16165000 200743489
real 1m54.302s
user 2m14.360s
sys 0m1.344s
против.
$ time python -m trace --trace --ignore-dir /usr/lib/python2.7 --ignore-dir /usr/lib/pymodules repost.py 2>&1 | wc
42 210 2169
real 0m12.570s
user 0m12.421s
sys 0m0.108s
это не отвечает на ваш вопрос; вы попросили эквивалент Python set -x
. простой способ приблизиться к sys.settrace()
:
[email protected]:/tmp$ cat test.py
#!/usr/bin/python -OO
'''
test program for sys.settrace
'''
import sys, linecache
TRACING = []
def traceit(frame, event, arg):
if event == "line":
lineno = frame.f_lineno
line = linecache.getline(sys.argv[0], lineno)
if TRACING:
print "%d: %s" % (lineno, line.rstrip())
return traceit
def test():
print 'this first line should not trace'
TRACING.append(True)
print 'this line and the following ought to show'
print "that all folks"
TRACING.pop()
print 'this last line should not trace'
if __name__ == '__main__':
sys.settrace(traceit)
test()
который при запуске дает:
[email protected]:/tmp$ ./test.py
this first line should not trace
19: print 'this line and the following ought to show'
this line and the following ought to show
20: print "that all folks"
that all folks
21: TRACING.pop()
this last line should not trace
устранение строки "TRACING.pop()" из вывода трассировки остается в виде упражнения для читателя.
Источники: https://pymotw.com/2/sys/tracing.html и http://www.dalkescientific.com/writings/diary/archive/2005/04/20/tracing_python_code.html