2013-06-20 6 views
16

से है, मैं अभी भी पांडों का उपयोग करके पाइथन के साथ नया हूं, और मुझे कुछ पाइथन लिपि को डिबग करने में कुछ समस्याएं आई हैं।कैसे पता लगाएं कि पाइथन चेतावनी

मैं निम्नलिखित चेतावनी संदेश मिल गया है:

[...]\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) 

और कहाँ से है नहीं मिल रहा।

कुछ शोध के बाद, मैं करने के लिए है कि पांडा lib फ़ाइल (index.py) में करने की कोशिश की:

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

लेकिन उस चेतावनी संदेश के बारे में कुछ भी नहीं बदला।

+0

मुझे लगता है कि इसे बढ़ाने के लिए मजबूर करना सबसे आसान तरीका है, तो आप सामान्य के रूप में डीबग कर सकते हैं। –

उत्तर

14

आप filter the warnings जो (pdb जैसे प्रयोग करके) डिबग करने में सक्षम करेगा बढ़ाने के लिए कर सकते हैं:

import warnings 
warnings.filterwarnings('error') 

* warnings filter अधिक पतले (जो शायद अधिक उपयुक्त है) प्रबंधित किया जा सकता जैसे:

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

एकाधिक फ़िल्टर अनुक्रमिक रूप से देखा जाएगा। ("बाद में सूची में सूची ओवरराइड प्रविष्टियों के सामने के करीब प्रविष्टियों, अगर दोनों एक विशेष चेतावनी मेल खाते हैं।")

+0

मैं उन मामलों को देख रहा हूं जहां व्यापक चेतावनी (ड्राइवर स्क्रिप्ट में) परिणामस्वरूप कोई त्रुटि नहीं होती है या ड्राइवर द्वारा उपयोग किए जाने वाले मॉड्यूल में चेतावनी होती है, जबकि जब मैं चेतावनियों का उपयोग नहीं करता, तो मुझे चेतावनी दिखाई देती है। इसके साथ कोई अनुभव? – HaPsantran

+0

@HaPsantran कृपया इसे एक नए प्रश्न के रूप में पूछें, इस तरह इसे अधिक ध्यान मिलेगा। नए प्रश्न के लिंक के साथ मुझे यहां सीसी मुक्त महसूस करें। मुझे यकीन नहीं है कि मैं आपका अनुसरण करता हूं, लेकिन यहां बिंदु यह है कि एक पुस्तकालय चेतावनी दे सकता है और हम इसे अपवाद बनाना चाहते हैं (इसलिए हम उस चेतावनी को अधिक आसानी से ठीक कर सकते हैं)। –

0

यदि आप पाइथन में लॉगिंग सक्षम करते हैं, तो जब कोई अपवाद प्राप्त होता है तो आप अपवाद पकड़े जाने पर लॉग इन करने के लिए logging.exception विधि का उपयोग कर सकते हैं - यह विधि एक अच्छी तरह से स्वरूपित स्टैक ट्रेस मुद्रित करेगी जो आपको वास्तव में कोड में दिखाती है अपवाद उत्पन्न हुआ। अधिक जानकारी के लिए python document on logging देखें।

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') 

वैकल्पिक रूप से, आप एक टपल कि sys.exc_info() फोन करके अपने कोड में अपवाद का विवरण होता है प्राप्त कर सकते हैं (इस sys मॉड्यूल आयात करने के लिए आप की आवश्यकता है)।

+0

धन्यवाद, लेकिन लाइन नंबर को छोड़कर चेतावनी संदेश भी नहीं बदला (अभी भी 'self._engine.get_loc (key)' पर वापस लौटें।)। यह अजीब है, लेकिन मुझे लगता है कि ऐसा होगा क्योंकि यह एक lib है इसलिए यह संकलित (.pyc) फ़ाइल का उपयोग कर रहा है? ** आप आमतौर पर libs ** से चेतावनियां कैसे डीबग करते हैं? – Bonswouar

+0

आह इसलिए आपके पास स्रोत कोड नहीं है - जो जीवन को मुश्किल बनाता है! क्या आप स्रोत कोड पकड़ सकते हैं?यदि नहीं, तो मैं बंद पुस्तकालय में अलग-अलग डेटा को पास करने के साथ प्रयोग करना शुरू कर दूंगा ताकि आप यह देख सकें कि आप जो डेटा प्रदान कर रहे हैं उसके बारे में क्या है, जो त्रुटि का कारण बनता है। आखिरी उपाय के रूप में, लाइब्रेरी को अपनाना (उदाहरण के लिए [dis] (http://docs.python.org/2/library/dis.html) का उपयोग करना) और अपूर्ण स्रोत में डीबगिंग करना एकमात्र तरीका हो सकता है इसके नीचे – robjohncox

+0

मेरे पास स्रोत कोड (सभी .pyc .py और .pyo फ़ाइलों को एक साथ) है, लेकिन (इसे) इसे कैसे काम करने के लिए इसे पुन: संकलित करना चाहिए? – Bonswouar

6

तुम भी चेतावनी को नियंत्रित करने के कमांडलाइन उपयोग कर सकते हैं:

python -W error::UnicodeWarning your_code.py 

से आदमी पेज:

डब्ल्यू तर्क
[...] त्रुटि एक चेतावनी संदेश मुद्रण के बजाय एक अपवाद को बढ़ाने के लिए।

यह अपने कोड में निम्नलिखित डाल के रूप में ही प्रभाव होगा:

import warnings 
warnings.filterwarnings('error', category=UnicodeWarning) 

जैसा कि पहले ही एंडी जवाब में कहा गया था।

संबंधित मुद्दे