Pytasz o rozwiązania statyczne. Oto dynamiczny. Załóżmy, że uruchamiasz kod i widzisz błędny wydruk lub piszesz do sys.stdout i chcesz wiedzieć, skąd pochodzi. Można zastąpić sys.stdout i pozwól pomocą wyjątek Traceback Ci:
>>> import sys
>>> def go():
... sys.stdout = None
... print "Hello!"
...
>>> go()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in go
AttributeError: 'NoneType' object has no attribute 'write'
>>> print "Here"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'write'
>>>
Na coś bardziej wyrafinowanego, zastąpić „sys.stdout” z czegoś, co raportuje, gdzie znajduje się instrukcja print. Użyję traceback.print_stack(), aby pokazać pełny stos, ale możesz zrobić inne rzeczy, takie jak użycie sys._getframe(), aby wyszukać jeden poziom stosu, aby uzyskać numer linii i nazwę pliku.
import sys
import traceback
class TracePrints(object):
def __init__(self):
self.stdout = sys.stdout
def write(self, s):
self.stdout.write("Writing %r\n" % s)
traceback.print_stack(file=self.stdout)
sys.stdout = TracePrints()
def a():
print "I am here"
def b():
a()
b()
Oto wynik
Writing 'I am here'
File "stdout.py", line 19, in <module>
b()
File "stdout.py", line 17, in b
a()
File "stdout.py", line 14, in a
print "I am here"
File "stdout.py", line 9, in write
traceback.print_stack(file=self.stdout)
Writing '\n'
File "stdout.py", line 19, in <module>
b()
File "stdout.py", line 17, in b
a()
File "stdout.py", line 14, in a
print "I am here"
File "stdout.py", line 9, in write
traceback.print_stack(file=self.stdout)
Jeśli pójdziesz tą drogą, patrz także moduł „linecache”, którego można użyć, aby wydrukować zawartość wiersza. Zapoznaj się z implementacją pliku traceback.print_stack, aby dowiedzieć się, jak to zrobić.
Jaki edytor tekstu i system operacyjny ...? –
Używanie Pydev'a w Eclipse – Casebash
Ustawienie tracefunc uruchomi go dla wszystkich połączeń, bez względu na to, jak zostały napisane. – Geo