2013-06-20 10 views
16

Python ile Panda'ları kullanarak hala yeni bir durumum var ve Python betiğimde hata ayıklama sorunlarım var.Python Uyarısı'nın nerede olduğunu öğrenmek için

Ben şu uyarı mesajını var:

[...]\pandas\core\index.py:756: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 
return self._engine.get_loc(key) 

Ve nereli bulamıyorum.

bazı araştırma sonra Pandalar lib dosyası (index.py) 'de bunu yapmaya çalıştık:

try: 
    return self._engine.get_loc(key) 
except UnicodeWarning: 
    warnings.warn('Oh Non', stacklevel=2) 

Ama bu uyarı mesajı hakkında bir şey değişmedi.

+0

Sanırım en kolay yolu yükseltmek için zorlamak, sonra normal olarak hata ayıklamak olabilir. –

cevap

14

Sen filter the warnings debug (örn kullanarak Pdb) sağlayacak olan yükseltmek olabilir:

import warnings 
warnings.filterwarnings('error') 

* warnings filter daha ince (muhtemelen daha uygun olan) yönetilebilir örn:

warnings.filterwarnings('error', category=UnicodeWarning) 
warnings.filterwarnings('error', message='*equal comparison failed*') 

Birden fazla filtre sırayla bakılacaktır. ("Hem belirli bir uyarı karşılıyorsa daha sonra listede liste geçersiz kılma girişlerinin önüne daha yakın Girişleri.") Ayrıca uyarıları kontrol etmek CommandLine kullanabilirsiniz

+0

Daha geniş uyarının (bir sürücü komut dosyasında) eklenmesi, sürücünün kullandığı modülle sonuçlanan bir uyarı VEYA uyarısı ile sonuçlanırken, uyarıları kullanmadığım durumlarda uyarıyı görüyorum. Bununla ilgili herhangi bir deneyim var mı? – HaPsantran

+0

@HaPsantran bunu yeni bir soru olarak sorun, bu şekilde daha fazla dikkat çekecek. Yeni soruya bir bağlantı ile CC beni burada çekin. Seni takip ettiğimden emin değilim, ama burada bir kitaplık uyarmak ve bunu bir istisna yapmak istiyoruz (bu uyarımı daha kolay bir şekilde çözebiliriz). –

0

Python'da günlüğe kaydetmeyi etkinleştirirseniz, bir özel durum alındığında logging.exception yöntemini kullanarak bir özel durum yakalandığında günlüğe kaydetme yöntemini kullanabilirsiniz. Bu yöntem, kodun tam olarak nerede olduğunu gösteren güzel bir biçimde biçimlendirilmiş yığın izi basacaktır. istisna kaynaklandı. Daha fazla bilgi için python document on logging'a bakın.

import logging 
log = logging.getLogger('my.module.logger') 

try: 
    return self._engine.get_loc(key) 
except UnicodeWarning: 
    log.exception('A log message of your choosing') 

Alternatif olarak, sys.exc_info() arayarak kodunuzda istisna ayrıntıları içeren bir demet alabilirsiniz (bu sys modülü almak gerektirir).

+0

Teşekkürler, ancak aynı zamanda, hat numarası dışında (hala '' self._engine.get_loc (key) 'geri dönüşü) uyarı mesajını da değiştirmedik. Bu garip, ama sanırım bunun bir lib olması, yani derlenmiş (.pyc) dosyasını kullanmasıdır. ** Genellikle libs'lerden uyarıları nasıl ayıklarsınız **? – Bonswouar

+0

Ah Yani kaynak kodunuz yok - bu hayatı zorlaştırıyor! Kaynak kodunu tutabilir misin?Eğer değilse, o zaman ben hataya neden olan veri hakkında ne olduğunu izole edip edemeyeceğinizi görmek için kapalı kütüphaneye farklı verileri aktarmayı denemeye başlarım. Son çare olarak, kütüphaneyi (örneğin [dis] (http://docs.python.org/2/library/dis.html) kullanarak) ve decompiled kaynağına hata ayıklamak için kaynak ayırmak için tek yol olabilir. Onun dibinde. – robjohncox

+0

Kaynak kodum var (tüm .pyc .py ve .pyo dosyaları birlikte), ancak (nasıl) çalışmasını sağlamak için yeniden derlemeliyim? – Bonswouar

6

:

python -W error::UnicodeWarning your_code.py 

itibaren adam sayfa:

-W argüman
[...] hata bir uyarı mesajı yazdırmak yerine bir istisna yükseltmek.

Bu

kodunuzda aşağıdaki koyarak aynı etkiye sahip olur:
import warnings 
warnings.filterwarnings('error', category=UnicodeWarning) 

Daha önce Andy'nin cevap söyleniyordu

.