рдореИрдВ рд╕рд╛рдВрддреНрд╡рдирд╛ рдореЗрдВ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд╕рдВрдШрд░реНрд╖ рдХрд┐рдпрд╛

рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдЕрдкрдиреА рдЦреБрдж рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ-рдореБрдЦрдмрд┐рд░ рд╕рдордЬрд╝реНрдЬрд╝рдд рдХреЗ рд▓рд┐рдП рджреМрдбрд╝рдирд╛ рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ "рд░рд╣рд╕реНрдпрдордп рдкреНрд░рддреАрдХреЛрдВ" рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП , рдореИрдВрдиреЗ рдЦреБрдж рд╕реЗ рдХрд╣рд╛: "рдЕрдм, рдЖрдЦрд┐рд░рдХрд╛рд░, рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд▓реЙрдЧрд┐рдВрдЧ рдмрдирд╛рдЗрдП!"

рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╣рд╛рдмрд░рд╛-рдХреИрдЯ (рд╕рдм рдХреБрдЫ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рдкрд╛рдпрдерди 2.x рд╢рд╛рдЦрд╛ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ) рдХреЗ рддрд╣рдд Win32 рдореЗрдВ Django-vsky рдЬреИрд╕реЗ рд▓реЙрдЧ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХреИрд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдкрд╣рд▓рд╛ рдХрд╛рдоред рдХрдВрд╕реЛрд▓ рдХреЛ рд╕рд╣реА рдкрд╛рда рдЖрдЙрдЯрдкреБрдЯ

рд▓рдХреНрд╖рдг

рдЬрдм рддрдХ рд╣рдо рдЖрд░рдВрднрд┐рдХ I / O рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреЛрдИ "рд╕реБрдзрд╛рд░" рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдпреВрдирд┐рдХреЛрдб рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рд┐рдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ OS рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдм рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

"рдЪрдорддреНрдХрд╛рд░" рдЖрдЧреЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ - рдЕрдЧрд░ рд╣рдо рдХрд┐рд╕реА рднреА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ (рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рджреЗрдЦреЗрдВ) рдпрд╛ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдЖрдкрдХреЛ utf-8 рдореЗрдВ рдХрдЪрд░рд╛ рдорд┐рд▓рддрд╛ рд╣реИред рдЖрдк рдЬреАрдд рдХреЗ рддрд╣рдд рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - 1251 рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХреНрд░реЙрд▓ рдХрд░рддрд╛ рд╣реИ ...

рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рднреНрд░рдордг

рд╡рд░реНрдгреЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ:

рд╣рдо рдЗрд╕рдХрд╛ рд╣рд▓ рдвреВрдВрдв рд░рд╣реЗ рд╣реИрдВ

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЙрдиреНрд╣реЗрдВ рдПрдХрд░реВрдкрддрд╛ рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдФрд░ рдпрд╣рд╛рдБ рдордЬрд╝рд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:
 # -*- coding: utf-8 -*- >>> import sys >>> import locale >>> print sys.getdefaultencoding() ascii >>> print locale.getpreferredencoding() # linux UTF-8 >>> print locale.getpreferredencoding() # win32/rus cp1251 #   : >>> print sys.stdout.encoding # linux UTF-8 >>> print sys.stdout.encoding # win32 cp866 

рдЕрд╣рд╛! рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ "рд╕рд┐рд╕реНрдЯрдо" ASCII рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд░рд╣рддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдПрдХ "рдкрд╕рдВрджреАрджрд╛" рдЕрдкрд╡рд╛рдж UnicodeEncodeError/UnicodeDecodeError рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╣рд░ рдЬрдЧрд╣ utf-8 рд╣реИ, рддреЛ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдирдХреЛрдбрд┐рдВрдЧ рд╣реИрдВ - рддрдерд╛рдХрдерд┐рдд рдПрдПрдирдПрд╕рдЖрдИ, рдпрд╣ cp1251 рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреНрд░рд╛рдлрд┐рдХ рднрд╛рдЧ рдФрд░ OEM рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ cp866 рд╣реИ, рдЬреЛ рдкрд╛рда рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрдВрд╕реЛрд▓ред DOS рдХреЗ рдмрд╛рдж рд╕реЗ OEM рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдпрд╛ рд╣реИ, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рд╡рд┐рд╢реЗрд╖ рдЯреАрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рднреА рдкреБрди: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреЛрдИ рднреА рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рддрдХ, рдореИрдВрдиреЗ рдЗрд╕ рдЙрдкрджреНрд░рд╡ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдерд╛:
 #!/usr/bin/env python # -*- coding: utf-8 -*- # ============== # Main script file # ============== import sys reload(sys) sys.setdefaultencoding('utf-8') #  import locale sys.setdefaultencoding(locale.getpreferredencoding()) # ... 

рдФрд░ рд╡рд╣, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдХрд╛рдо рдХрд┐рдпрд╛ред рдЬрдм рддрдХ рдореИрдВрдиреЗ print рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рддрдм рддрдХ рдХрд╛рдо рдХрд┐рдпрд╛ред рдЬрдм рдореИрдВ logging рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреНрд░реАрди рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдЧрдпрд╛ logging рд╕рдм рдХреБрдЫ рдЯреВрдЯ рдЧрдпрд╛ред
рд╣рд╛рдБ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдЪреВрдВрдХрд┐ "рдпрд╣" рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЙрд╕реА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рд╕реЗрдЯ рдХрд░реВрдБрдЧрд╛:
 sys.setdefaultencoding(sys.stdout.encoding or sys.stderr.encoding) 

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди:

рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ cp866 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рдХреЗрд╡рд▓ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдЯреНрд░реАрдо рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдХрд╛рд░реНрдп рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ utf-8 рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХрдВрд╕реЛрд▓ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реИред
рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
 import sys import codecs sys.stdout = codecs.getwriter('cp866')(sys.stdout,'replace') 

рдпрд╣ рдХреЛрдб рдЖрдкрдХреЛ рдПрдХ рдкрддреНрдерд░ рд╕реЗ рджреЛ рдкрдХреНрд╖рд┐рдпреЛрдВ рдХреЛ рдорд╛рд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рд╡рд╛рдВрдЫрд┐рдд рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ umlauts рдФрд░ рдЕрдиреНрдп рдЯрд╛рдЗрдкреЛрдЧреНрд░рд╛рдлреА рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╕рдордп рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рдЕрдкрдиреА рд╕реБрд░рдХреНрд╖рд╛ рдХрд░реЗрдВ рдЬреЛ рдХрд┐ cp866 рдХреЗ 255 рд╡рд░реНрдгреЛрдВ рдореЗрдВ рдЧрд╛рдпрдм рд╣реИред
рдпрд╣ рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ - рдореИрдВ рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЧреЛрд▓рд╛рдХрд╛рд░ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ OEM рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рдХреИрд╕реЗ рдЬрд╛рди рд╕рдХрддрд╛ рд╣реВрдВ? рдЕрдЬрдЧрд░ рдореЗрдВ ANSI / OEM рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдЧреБрдЧрд▓реА рдХрд░рдирд╛ рдЙрдЪрд┐рдд рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ WinAPI рдХреЛ рдереЛрдбрд╝рд╛ рдпрд╛рдж рдХрд░рдирд╛ рдкрдбрд╝рд╛
 UINT GetOEMCP(void); //   OEM     UINT GetANSICP(void); //    ANSI   

... рдФрд░ рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрд╛:
 # -*- coding: utf-8 -*- import sys import codecs def setup_console(sys_enc="utf-8"): reload(sys) try: #  win32     if sys.platform.startswith("win"): import ctypes enc = "cp%d" % ctypes.windll.kernel32.GetOEMCP() #TODO:   win64/python64 else: #  Linux , ,    enc = (sys.stdout.encoding if sys.stdout.isatty() else sys.stderr.encoding if sys.stderr.isatty() else sys.getfilesystemencoding() or sys_enc) #   sys sys.setdefaultencoding(sys_enc) #    ,     if sys.stdout.isatty() and sys.stdout.encoding != enc: sys.stdout = codecs.getwriter(enc)(sys.stdout, 'replace') if sys.stderr.isatty() and sys.stderr.encoding != enc: sys.stderr = codecs.getwriter(enc)(sys.stderr, 'replace') except: pass # ?    -  -... 

рджреВрд╕рд░рд╛ рдХрд╛рд░реНрдпред рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЛ рд░рдВрдЧреАрди рдХрд░реЗрдВ

рд╡реЗрд░реНрдХреЗрдЧ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдЬрдВрдЧ рдХреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЕрдкрдиреЗ рд▓рд┐рдП рднреА рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдЪрд╛рд╣рддрд╛ рдерд╛ред Googling , рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрдЯ рдкрд░, рд▓реЙрдЧрд┐рдВрдЧ.рд╕реНрдЯреНрд░реАрдорд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рдВрд╢рдЬ рд╕реЗ - рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд┐рдЧреНрд░реА рдХреА рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдорд╛рдирдХ рд╕реНрдЯреНрд░реАрдорд╣реИрдВрдбрд▓рд░ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╕рд░рд▓ рд╕реНрдЯреНрд░реАрдорд╣реИрдВрдбрд▓рд░ рд╡рд╛рд░рд┐рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдФрд░ рдЕрдм рддрдХ рдХрд╛рдлреА рд╕рдВрддреБрд╖реНрдЯ рд╣реВрдВ:
 class ColoredHandler( logging.StreamHandler ): def emit( self, record ): # Need to make a actual copy of the record # to prevent altering the message for other loggers myrecord = copy.copy( record ) levelno = myrecord.levelno if( levelno >= 50 ): # CRITICAL / FATAL color = '\x1b[31;1m' # red elif( levelno >= 40 ): # ERROR color = '\x1b[31m' # red elif( levelno >= 30 ): # WARNING color = '\x1b[33m' # yellow elif( levelno >= 20 ): # INFO color = '\x1b[32m' # green elif( levelno >= 10 ): # DEBUG color = '\x1b[35m' # pink else: # NOTSET and anything else color = '\x1b[0m' # normal myrecord.msg = (u"%s%s%s" % (color, myrecord.msg, '\x1b[0m')).encode('utf-8') # normal logging.StreamHandler.emit( self, myrecord ) 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ, рдпрд╣ рд╕рдм рдХрд╛рдо, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ред рдФрд░ рдЕрдЧрд░ рдкрд╣рд▓реЗ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдХрдВрд╕реЛрд▓ рдореЗрдВ "рдореИрдЬрд┐рдХ" ansi.dll рдХреЛ рд╕рд┐рдореНрдлрдиреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рд╡рд┐рдВрдбреЛрдЬ рд╕рд┐рд╕реНрдЯрдо рдлреЛрд▓реНрдбрд░ рдХреЗ рдмреЛрд▓реНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рдПрдПрдирдПрд╕ рдХреЛрдб рдХреЗ рд▓рд┐рдП "рдПрдиреЗрдмрд▓" рд╕рдкреЛрд░реНрдЯ рджрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рд╡рд┐рдВрдбреЛрдЬ 7 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ) рдпрд╣ рдлреАрдЪрд░ рдЖрдЦрд┐рд░рдХрд╛рд░ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ "рдХрдЯ" рд╣реЛ рдЧрдпрд╛ред ред рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ dll рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рднреА рдХрд┐рд╕реА рддрд░рд╣ "рдХреЛрд╖реЗрд░ рдирд╣реАрдВ рд╣реИред"

рд╣рдо рдлрд┐рд░ рд╕реЗ Google рдХреА рдУрд░ рд░реБрдЦ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╕реЗ, рд╣рдореЗрдВ рдХрдИ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рддреЗ рд╣реИрдВред рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп, рд╕рднреА рд╡рд┐рдХрд▓реНрдк рдХрдВрд╕реЛрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП WinAPI рдХреЙрд▓ рдХреЗ рд╕рд╛рде ANSI рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдХреНрд░рдо рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрдмрд╛рд▓рддреЗ рд╣реИрдВред

рд▓рд┐рдВрдХ рдкрд░ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рднрдЯрдХрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдПрдХ рд░рдВрдЧрдорд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЖрдпрд╛ред рдХрд┐рд╕реА рддрд░рд╣ рдореИрдВрдиреЗ рдЙрд╕реЗ рдмрд╛рдХреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдХрд┐рдпрд╛ред рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдлрд╛рдпрджреЛрдВ рдореЗрдВ рдкреВрд░реЗ рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╢рд╛рдорд┐рд▓ рд╣реИ - рдЖрдк рд░рдВрдЧреАрди рдкреНрд░рд┐рдВрдЯ рдХреЛ рд╕рд╛рдзрд╛рд░рдг print u"\x1b[31;40m- \x1b[0m" рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ print u"\x1b[31;40m- \x1b[0m" рдпрджрд┐ рдЖрдк рдЕрдЪрд╛рдирдХ рдореЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ print u"\x1b[31;40m- \x1b[0m" ред

рдореБрдЭреЗ рддреБрд░рдВрдд рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг 0.1.18 рдореЗрдВ рдПрдХ рдХрд╖реНрдЯрдкреНрд░рдж рдмрдЧ рд╣реИ рдЬреЛ рдпреВрдирд┐рдХреЛрдб рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд▓рд╛рдпрд╛ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рджреЛрдиреЛрдВ рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдФрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ "рдмреИрд╕рд╛рдЦреА" рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ:
 # -*- coding: utf-8 -*- import sys import codecs import copy import logging #: Is ANSI printing available ansi = not sys.platform.startswith("win") def setup_console(sys_enc='utf-8', use_colorama=True): """ Set sys.defaultencoding to `sys_enc` and update stdout/stderr writers to corresponding encoding .. note:: For Win32 the OEM console encoding will be used istead of `sys_enc` """ global ansi reload(sys) try: if sys.platform.startswith("win"): #... ,   if use_colorama and sys.platform.startswith("win"): try: #   colorama      `ansi`,    from colorama import init init() ansi = True except: pass class ColoredHandler( logging.StreamHandler ): def emit( self, record ): # Need to make a actual copy of the record # to prevent altering the message for other loggers myrecord = copy.copy( record ) levelno = myrecord.levelno if( levelno >= 50 ): # CRITICAL / FATAL color = '\x1b[31;1m' # red elif( levelno >= 40 ): # ERROR color = '\x1b[31m' # red elif( levelno >= 30 ): # WARNING color = '\x1b[33m' # yellow elif( levelno >= 20 ): # INFO color = '\x1b[32m' # green elif( levelno >= 10 ): # DEBUG color = '\x1b[35m' # pink else: # NOTSET and anything else color = '\x1b[0m' # normal myrecord.msg = (u"%s%s%s" % (color, myrecord.msg, '\x1b[0m')).encode('utf-8') # normal logging.StreamHandler.emit( self, myrecord ) 

рдЖрдЧреЗ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
 #!/usr/bin/env python # -*- coding: utf-8 -*- from setupcon import setup_console setup_console('utf-8', False) #... #       import setupcon setupcon.setup_console() import logging #... if setupcon.ansi: logging.getLogger().addHandler(setupcon.ColoredHandler()) 


рд╡рд╣ рд╕рдм рд╣реИред рд╕рдВрднрд╛рд╡рд┐рдд рд╕реБрдзрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ, рдпрд╣ win64 рдЕрдЬрдЧрд░ рдХреЗ рддрд╣рдд рд╕рдВрдЪрд╛рд▓рди рдХреНрд╖рдорддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдГ, рдПрдХ рд╣реА StackOverflow рдкрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдЦреБрдж рдХреЛ isatty рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ColoredHandler рдорд┐рд▓рддрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдореА рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ dzz.org рдкрд░ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

Source: https://habr.com/ru/post/In117236/


All Articles