2014-06-26 17 views
13

Şu anda Python'da oldukça karmaşık bir sistem yapıyorum ve hata ayıklama yaptığımda çoğu zaman basit betiklere çok sayıda yazı yazdım. Genel görünümü korumak için sık sık baskı ifadesinin bulunduğu dosya adını ve satır numarasını yazdırmak istiyorum. Tabii el ile yapmak veya böyle bir şey ile olabilir:Python hata ayıklaması: bir işlevin çağrıldığı dosya adı ve satır numarası olsun?

from inspect import currentframe, getframeinfo 
print getframeinfo(currentframe()).filename + ':' + str(getframeinfo(currentframe()).lineno) + ' - ', 'what I actually want to print out here' 

gibi bir şey yazdırır hangi:

filenameX.py:273 - Aslında

burada yazdırmak istediğini

print debuginfo(), 'what I actually want to print out here' 

:

ben böyle bir şey yapmak isterler, daha basit hale getirmek için Yani bir yerde bir işlevi koydu ve yapıyor çalıştı: maalesef

from debugutil import debuginfo 
print debuginfo(), 'what I actually want to print out here' 
print debuginfo(), 'and something else here' 

, alıyorum:

debugutil.py:3 - what I actually want to print out here 
debugutil.py:3 - and something else here 

yerine, ben işlevini tanımlı hangi dosya adı ve satır numarası yazdırır Ben debuginfo() aradığım satır. Bu barizdir, çünkü kod debugutil.py dosyasında bulunur.

Bu yüzden sorum şu: Bu debuginfo() işlevinin çağrıldığı dosya adını ve satır numarasını nasıl alabilirim? Tüm ipuçları memnuniyetle kabul edilir!

+0

Kullanımı 'logging' modülü ve biçimlendiriciyi yapılandırın: https://docs.python.org/2/library/logging.html#logrecord-attributes. Tornado web çerçevesi aslında buna çok benzer bir biçime sahiptir, bu yüzden muhtemelen kodlarını kullanabilirsiniz: http://tornado.readthedocs.org/en/latest/_modules/tornado/log.html#LogFormatter – Blender

cevap

26

arayan ile başlayan ve istediğiniz bilgilere ulaşmak için kullanabileceğiniz, dışarı hareket, frame records listesini döndürür inspect.stack() fonksiyonu:

from inspect import getframeinfo, stack 

def debuginfo(message): 
    caller = getframeinfo(stack()[1][0]) 
    print "%s:%d - %s" % (caller.filename, caller.lineno, message) 

def grr(arg): 
    debuginfo(arg) 

grr("aargh") 

Çıktı:

example.py:8 - aargh 
+0

Tamam, bu iyi. –

+0

Yardımlarınız için teşekkürler! Bunu, üzerinde çalıştığım her projede kullanacağım! Siz efendim, hayatımı şimdi biraz daha iyi yaptım ki şimdi resmen "harika" diyebilirim! – kramer65

+0

Bu harika! Django'da, nerede arandığını anlayamadığım bir işlev vardı. – Sankalp

0

Sadece bir fonksiyonu haline yayınlanmıştır kodu koyun: o şekilde size

# ... some code here ... 
my_custom_debuginfo('what I actually want to print out here') 
# ... more code ... 

Ben ayrı bir modülde bu işlevi koymak önerilir: o zaman

from inspect import currentframe, getframeinfo 

def my_custom_debuginfo(message): 
    print getframeinfo(currentframe()).filename + ':' + str(getframeinfo(currentframe()).lineno) + ' - ', message 

ve istediğiniz gibi kullanabilirsiniz İhtiyacınız olan her zaman yeniden kullanabilirsiniz.

+0

Zaten yaptığım buydu ve sonra işlevin bulunduğu yerde değil, işlevin bulunduğu modülün dosya adını ve satır numarasını yazdırır. Başka fikirlerin var mı? – kramer65

İlgili konular