<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
<title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
I've been googling for a couple of days regarding the Python debugger
and haven't found an answer. Is there any way to modify a local
variable in the Python debugger (pdb)? Given the following (totally
contrived, for example only) Python file:<br>
<br>
<font face="Courier New, Courier, monospace">#!/usr/bin/env python<br>
<br>
import pdb<br>
f = 'aaa'<br>
<br>
def b(f):<br>
print f<br>
<br>
<br>
def main():<br>
global f<br>
for f in ['a', 'b', 'c']:<br>
if f == 'd':<br>
b(f)<br>
<br>
if __name__ == "__main__":<br>
pdb.run('main()')<br>
<br>
</font>I can modify global f like this (so that method b() will be
called):<br>
<br>
<font face="Courier New, Courier, monospace">[jmjones@qatestrunner
debugger]$ python dbg_test.py<br>
> <string>(1)?()<br>
(Pdb) s<br>
--Call--<br>
> /home/jmjones/src/py_test/debugger/dbg_test.py(10)main()<br>
-> def main():<br>
(Pdb) l 1, 20<br>
1 #!/usr/bin/env python<br>
2<br>
3 import pdb<br>
4 f = 'aaa'<br>
5<br>
6 def b(f):<br>
7 print f<br>
8<br>
9<br>
10 -> def main():<br>
11 global f<br>
12 for f in ['a', 'b', 'c']:<br>
13 if f == 'd':<br>
14 b(f)<br>
15<br>
16 if __name__ == "__main__":<br>
17 pdb.run('main()')<br>
[EOF]<br>
(Pdb) b 12<br>
Breakpoint 1 at /home/jmjones/src/py_test/debugger/dbg_test.py:12<br>
(Pdb) c<br>
> /home/jmjones/src/py_test/debugger/dbg_test.py(12)main()<br>
-> for f in ['a', 'b', 'c']:<br>
(Pdb) f<br>
'aaa'<br>
(Pdb) s<br>
> /home/jmjones/src/py_test/debugger/dbg_test.py(13)main()<br>
-> if f == 'd':<br>
(Pdb) f<br>
'a'<br>
(Pdb) global f; f = 'd'<br>
(Pdb) f<br>
'd'<br>
(Pdb) s<br>
> /home/jmjones/src/py_test/debugger/dbg_test.py(14)main()<br>
-> b(f)<br>
(Pdb) s<br>
--Call--<br>
> /home/jmjones/src/py_test/debugger/dbg_test.py(6)b()<br>
-> def b(f):<br>
(Pdb)</font><br>
<br>
<br>
However, if I modify the source file so f is not a global, like this:<br>
<br>
<font face="Courier New, Courier, monospace">#!/usr/bin/env python<br>
<br>
import pdb<br>
<br>
def b(f):<br>
print f<br>
<br>
<br>
def main():<br>
for f in ['a', 'b', 'c']:<br>
if f == 'd':<br>
b(f)<br>
<br>
if __name__ == "__main__":<br>
pdb.run('main()')</font><br>
<br>
<br>
How do I modify f? Here's my attempt (and global doesn't work here and
shouldn't since it's not global in this example):<br>
<br>
<font face="Courier New, Courier, monospace">[jmjones@qatestrunner
debugger]$ python dbg_test.py<br>
> <string>(1)?()<br>
(Pdb) s<br>
--Call--<br>
> /home/jmjones/src/py_test/debugger/dbg_test.py(9)main()<br>
-> def main():<br>
(Pdb) l 1, 20<br>
1 #!/usr/bin/env python<br>
2<br>
3 import pdb<br>
4<br>
5 def b(f):<br>
6 print f<br>
7<br>
8<br>
9 -> def main():<br>
10 for f in ['a', 'b', 'c']:<br>
11 if f == 'd':<br>
12 b(f)<br>
13<br>
14 if __name__ == "__main__":<br>
15 pdb.run('main()')<br>
[EOF]<br>
(Pdb) b 11<br>
Breakpoint 1 at /home/jmjones/src/py_test/debugger/dbg_test.py:11<br>
(Pdb) c<br>
> /home/jmjones/src/py_test/debugger/dbg_test.py(11)main()<br>
-> if f == 'd':<br>
(Pdb) f<br>
'a'<br>
(Pdb) f = 'd'<br>
(Pdb) f<br>
'a'<br>
(Pdb) global f; f = 'd'<br>
(Pdb) f<br>
'a'<br>
(Pdb)<br>
</font><br>
<br>
</body>
</html>