14

Using:

traceback.print_stack()

I can get:

  File "x.py", line 20, in <module>
    y(x)
  File "x.py", line 11, in y
    fun(x)
  File "x.py", line 8, in fun
    traceback.print_stack()

I there any way to get something like this:

  File "x.py", line 20, in <module>
    y(x) WHERE x == 1
  File "x.py", line 11, in y
    fun(x) WHERE x == 'str'
  File "x.py", line 8, in fun
    traceback.print_stack()

I just want to see what arguments was passed to functions.

BartoszKP
  • 34,786
  • 15
  • 102
  • 130
Adam
  • 2,254
  • 3
  • 24
  • 42
  • Python would have to store these past values whenever it calls a function, so I don't think so. If you're just trying to debug then use a real debugger or log the values. – Jochen Ritzel May 19 '11 at 16:30
  • 1
    @Jochen: I think Python does store the values, since the traceback references the frame, so the frame is not garbage collected. – Sven Marnach May 19 '11 at 16:32
  • @Jochen: I'm not trying to debug. I just want to put this information in log. To have more info about that what I need to debug. – Adam May 19 '11 at 16:54
  • @Adam Please post your solution as an answer, don't include it in the question. I've removed it, but you can access it in the revision history: http://stackoverflow.com/posts/6061744/revisions – BartoszKP May 04 '15 at 13:23

2 Answers2

14

You can probably rig something up by using inspect.getargvalues() and accessing the stack frame belonging to your traceback:

 inspect.getargvalues(traceback.tb_frame)

You'll have to do some work to get the output exactly as desired. The above line is only for the innermost frame, so you'll have to walk up the stack and access the information you need for every frame. inspect.getouterframes() might come in handy.

Sven Marnach
  • 574,206
  • 118
  • 941
  • 841
10

You can use the inspect module for this:

>>> import inspect
... def fn(x):
...     try:
...         print(1/0)
...     except ZeroDivisionError as e:
...         frames = inspect.trace()
...         argvalues = inspect.getargvalues(frames[0][0])
...         print("Argvalues: ", inspect.formatargvalues(*argvalues))
>>> fn(12)
Argvalues:  (x=12)
Tim Lesher
  • 6,341
  • 2
  • 28
  • 42