Trong Python, làm cách nào tôi có thể in ngăn xếp cuộc gọi hiện tại từ trong một phương thức (cho mục đích gỡ lỗi).
Trong Python, làm cách nào tôi có thể in ngăn xếp cuộc gọi hiện tại từ trong một phương thức (cho mục đích gỡ lỗi).
Câu trả lời:
Dưới đây là một ví dụ về việc chồng qua traceback mô-đun, và in nó:
import traceback
def f():
g()
def g():
for line in traceback.format_stack():
print(line.strip())
f()
# Prints:
# File "so-stack.py", line 10, in <module>
# f()
# File "so-stack.py", line 4, in f
# g()
# File "so-stack.py", line 7, in g
# for line in traceback.format_stack():
Nếu bạn thực sự chỉ muốn in ngăn xếp lên stderr, bạn có thể sử dụng:
traceback.print_stack()
Hoặc để in ra thiết bị xuất chuẩn (hữu ích nếu muốn giữ đầu ra được chuyển hướng cùng nhau), hãy sử dụng:
traceback.print_stack(file=sys.stdout)
Nhưng có được nó thông qua traceback.format_stack()
cho phép bạn làm bất cứ điều gì bạn muốn với nó.
sys._current_frames()
. Ví dụ: py_better_exchookdump_all_thread_tracebacks
làm điều đó (từ chối trách nhiệm: Tôi đã viết điều đó).
import traceback
traceback.print_stack()
traceback.print_exc()
cái mà cung cấp cho bạn gần như cùng một thứ mà bạn sẽ nhận được mà không cần except
tuyên bố (và cũng ít mã hóa hơn câu trả lời được chấp nhận).
traceback.print_exc()
in dấu vết ngăn xếp cho bất kỳ ngoại lệ nào bạn có thể xử lý - nhưng điều này không giải quyết được câu hỏi ban đầu, đó là cách in ngăn xếp hiện tại ("bạn đang ở đâu" trái ngược với "mã của bạn ở đâu khi ngoại lệ cuối cùng đi tắt, nếu có ".)
inspect.stack()
trả về ngăn xếp hiện tại thay vì truy nguyên ngoại lệ:
import inspect
print inspect.stack()
Xem https://gist.github.com/FredLoney/5454553 để biết chức năng tiện ích log_stack.
Nếu bạn sử dụng trình gỡ lỗi python, không chỉ thăm dò các biến tương tác mà bạn có thể nhận được ngăn xếp cuộc gọi bằng lệnh "where" hoặc "w".
Vì vậy, ở đầu chương trình của bạn
import pdb
Sau đó, trong mã nơi bạn muốn xem những gì đang xảy ra
pdb.set_trace()
và bạn bị rơi vào một dấu nhắc
where
?
(pdb)
chỉ cần gõ where
và nó sẽ in dấu vết ngăn xếp đến thiết bị đầu cuối.
breakpoint()
mà không cần phải nhập pdb.
Đây là một biến thể của câu trả lời xuất sắc của @ RichieHulum, trong đó thực hiện một trình trang trí có thể được áp dụng có chọn lọc cho các chức năng như mong muốn. Hoạt động với Python 2.7.14 và 3.6.4.
from __future__ import print_function
import functools
import traceback
import sys
INDENT = 4*' '
def stacktrace(func):
@functools.wraps(func)
def wrapped(*args, **kwds):
# Get all but last line returned by traceback.format_stack()
# which is the line below.
callstack = '\n'.join([INDENT+line.strip() for line in traceback.format_stack()][:-1])
print('{}() called:'.format(func.__name__))
print(callstack)
return func(*args, **kwds)
return wrapped
@stacktrace
def test_func():
return 42
print(test_func())
Đầu ra từ mẫu:
test_func() called:
File "stacktrace_decorator.py", line 28, in <module>
print(test_func())
42
Cài đặt Kiểm tra-nó
pip3 install inspect-it --user
Mã
import inspect;print(*['\n\x1b[0;36;1m| \x1b[0;32;1m{:25}\x1b[0;36;1m| \x1b[0;35;1m{}'.format(str(x.function), x.filename+'\x1b[0;31;1m:'+str(x.lineno)+'\x1b[0m') for x in inspect.stack()])
bạn có thể tạo một đoạn của dòng này
nó sẽ hiển thị cho bạn một danh sách ngăn xếp cuộc gọi hàm với tên tệp và số dòng
danh sách từ đầu đến nơi bạn đặt dòng này