def prints(*args, **kwargs): ''' Print unicode arguments safely by encoding them to preferred_encoding Has the same signature as the print function from Python 3, except for the additional keyword argument safe_encode, which if set to True will cause the function to use repr when encoding fails. ''' file = kwargs.get('file', sys.stdout) sep = kwargs.get('sep', ' ') end = kwargs.get('end', '\n') enc = preferred_encoding safe_encode = kwargs.get('safe_encode', False) if 'CALIBRE_WORKER' in os.environ: enc = 'utf-8' for i, arg in enumerate(args): if isinstance(arg, unicode): if iswindows: from calibre.utils.terminal import Detect cs = Detect(file) if cs.is_console: cs.write_unicode_text(arg) if i != len(args)-1: file.write(bytes(sep)) continue try: arg = arg.encode(enc) except UnicodeEncodeError: try: arg = arg.encode('utf-8') except: if not safe_encode: raise arg = repr(arg) if not isinstance(arg, str): try: arg = str(arg) except ValueError: arg = unicode(arg) if isinstance(arg, unicode): try: arg = arg.encode(enc) except UnicodeEncodeError: try: arg = arg.encode('utf-8') except: if not safe_encode: raise arg = repr(arg) try: file.write(arg) except: import repr as reprlib file.write(reprlib.repr(arg)) if i != len(args)-1: file.write(bytes(sep)) file.write(bytes(end))
def prints(*args, **kwargs): ''' Print unicode arguments safely by encoding them to preferred_encoding Has the same signature as the print function from Python 3, except for the additional keyword argument safe_encode, which if set to True will cause the function to use repr when encoding fails. ''' file = kwargs.get('file', sys.stdout) sep = kwargs.get('sep', ' ') end = kwargs.get('end', '\n') enc = preferred_encoding safe_encode = kwargs.get('safe_encode', False) if 'CALIBRE_WORKER' in os.environ: enc = 'utf-8' for i, arg in enumerate(args): if isinstance(arg, unicode): if iswindows: from calibre.utils.terminal import Detect cs = Detect(file) if cs.is_console: cs.write_unicode_text(arg) if i != len(args) - 1: file.write(bytes(sep)) continue try: arg = arg.encode(enc) except UnicodeEncodeError: try: arg = arg.encode('utf-8') except: if not safe_encode: raise arg = repr(arg) if not isinstance(arg, str): try: arg = str(arg) except ValueError: arg = unicode(arg) if isinstance(arg, unicode): try: arg = arg.encode(enc) except UnicodeEncodeError: try: arg = arg.encode('utf-8') except: if not safe_encode: raise arg = repr(arg) try: file.write(arg) except: import repr as reprlib file.write(reprlib.repr(arg)) if i != len(args) - 1: file.write(bytes(sep)) file.write(bytes(end))
def prints(*args, **kwargs): ''' Print unicode arguments safely by encoding them to preferred_encoding Has the same signature as the print function from Python 3, except for the additional keyword argument safe_encode, which if set to True will cause the function to use repr when encoding fails. Returns the number of bytes written. ''' file = kwargs.get('file', sys.stdout) file = getattr(file, 'buffer', file) enc = 'utf-8' if hasenv('CALIBRE_WORKER') else preferred_encoding sep = kwargs.get('sep', ' ') if not isinstance(sep, bytes): sep = sep.encode(enc) end = kwargs.get('end', '\n') if not isinstance(end, bytes): end = end.encode(enc) safe_encode = kwargs.get('safe_encode', False) count = 0 for i, arg in enumerate(args): if isinstance(arg, unicode_type): if iswindows: from calibre.utils.terminal import Detect cs = Detect(file) if cs.is_console: cs.write_unicode_text(arg) count += len(arg) if i != len(args)-1: file.write(sep) count += len(sep) continue try: arg = arg.encode(enc) except UnicodeEncodeError: try: arg = arg.encode('utf-8') except: if not safe_encode: raise arg = repr(arg) if not isinstance(arg, bytes): try: arg = native_string_type(arg) except ValueError: arg = unicode_type(arg) if isinstance(arg, unicode_type): try: arg = arg.encode(enc) except UnicodeEncodeError: try: arg = arg.encode('utf-8') except: if not safe_encode: raise arg = repr(arg) try: file.write(arg) count += len(arg) except: from polyglot import reprlib arg = reprlib.repr(arg) file.write(arg) count += len(arg) if i != len(args)-1: file.write(sep) count += len(sep) file.write(end) count += len(end) return count
def prints(*args, **kwargs): """ Print unicode arguments safely by encoding them to preferred_encoding Has the same signature as the print function from Python 3, except for the additional keyword argument safe_encode, which if set to True will cause the function to use repr when encoding fails. Returns the number of bytes written. """ file = kwargs.get("file", sys.stdout) sep = bytes(kwargs.get("sep", " ")) end = bytes(kwargs.get("end", "\n")) enc = "utf-8" if "CALIBRE_WORKER" in os.environ else preferred_encoding safe_encode = kwargs.get("safe_encode", False) count = 0 for i, arg in enumerate(args): if isinstance(arg, unicode): if iswindows: from calibre.utils.terminal import Detect cs = Detect(file) if cs.is_console: cs.write_unicode_text(arg) count += len(arg) if i != len(args) - 1: file.write(sep) count += len(sep) continue try: arg = arg.encode(enc) except UnicodeEncodeError: try: arg = arg.encode("utf-8") except: if not safe_encode: raise arg = repr(arg) if not isinstance(arg, str): try: arg = str(arg) except ValueError: arg = unicode(arg) if isinstance(arg, unicode): try: arg = arg.encode(enc) except UnicodeEncodeError: try: arg = arg.encode("utf-8") except: if not safe_encode: raise arg = repr(arg) try: file.write(arg) count += len(arg) except: import repr as reprlib arg = reprlib.repr(arg) file.write(arg) count += len(arg) if i != len(args) - 1: file.write(sep) count += len(sep) file.write(end) count += len(sep) return count