%PDF- %PDF-
Direktori : /lib/calibre/calibre/ |
Current File : //lib/calibre/calibre/startup.py |
__license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' ''' Perform various initialization tasks. ''' import locale, sys, os # Default translation is NOOP from polyglot.builtins import builtins builtins.__dict__['_'] = lambda s: s # For strings which belong in the translation tables, but which shouldn't be # immediately translated to the environment language builtins.__dict__['__'] = lambda s: s # For backwards compat with some third party plugins builtins.__dict__['dynamic_property'] = lambda func: func(None) from calibre.constants import iswindows, ismacos, islinux, DEBUG, isfreebsd def get_debug_executable(): exe_name = 'calibre-debug' + ('.exe' if iswindows else '') if hasattr(sys, 'frameworks_dir'): base = os.path.dirname(sys.frameworks_dir) return [os.path.join(base, 'MacOS', exe_name)] if getattr(sys, 'run_local', None): return [sys.run_local, exe_name] nearby = os.path.join(os.path.dirname(os.path.abspath(sys.executable)), exe_name) if getattr(sys, 'frozen', False): return [nearby] exloc = getattr(sys, 'executables_location', None) if exloc: ans = os.path.join(exloc, exe_name) if os.path.exists(ans): return [ans] if os.path.exists(nearby): return [nearby] return [exe_name] def initialize_calibre(): if hasattr(initialize_calibre, 'initialized'): return initialize_calibre.initialized = True # Ensure that all temp files/dirs are created under a calibre tmp dir from calibre.ptempfile import base_dir try: base_dir() except OSError: pass # Ignore this error during startup, so we can show a better error message to the user later. # # Ensure that the max number of open files is at least 1024 if iswindows: # See https://msdn.microsoft.com/en-us/library/6e3b887c.aspx from calibre_extensions import winutil winutil.setmaxstdio(max(1024, winutil.getmaxstdio())) else: import resource soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE) if soft < 1024: try: resource.setrlimit(resource.RLIMIT_NOFILE, (min(1024, hard), hard)) except Exception: if DEBUG: import traceback traceback.print_exc() # # Fix multiprocessing from multiprocessing import spawn, util def get_command_line(**kwds): prog = 'from multiprocessing.spawn import spawn_main; spawn_main(%s)' prog %= ', '.join('%s=%r' % item for item in kwds.items()) return get_debug_executable() + ['--fix-multiprocessing', '--', prog] spawn.get_command_line = get_command_line orig_spawn_passfds = util.spawnv_passfds def spawnv_passfds(path, args, passfds): try: idx = args.index('-c') except ValueError: return orig_spawn_passfds(args[0], args, passfds) patched_args = get_debug_executable() + ['--fix-multiprocessing', '--'] + args[idx + 1:] return orig_spawn_passfds(patched_args[0], patched_args, passfds) util.spawnv_passfds = spawnv_passfds # # Setup resources import calibre.utils.resources as resources resources # # Setup translations from calibre.utils.localization import set_translators set_translators() # # Initialize locale # Import string as we do not want locale specific # string.whitespace/printable, on windows especially, this causes problems. # Before the delay load optimizations, string was loaded before this point # anyway, so we preserve the old behavior explicitly. import string string try: locale.setlocale(locale.LC_ALL, '') # set the locale to the user's default locale except: dl = locale.getdefaultlocale() try: if dl: locale.setlocale(locale.LC_ALL, dl[0]) except: pass builtins.__dict__['lopen'] = open # legacy compatibility from calibre.utils.icu import title_case, lower as icu_lower, upper as icu_upper builtins.__dict__['icu_lower'] = icu_lower builtins.__dict__['icu_upper'] = icu_upper builtins.__dict__['icu_title'] = title_case def connect_lambda(bound_signal, self, func, **kw): import weakref r = weakref.ref(self) del self num_args = func.__code__.co_argcount - 1 if num_args < 0: raise TypeError('lambda must take at least one argument') def slot(*args): ctx = r() if ctx is not None: if len(args) != num_args: args = args[:num_args] func(ctx, *args) bound_signal.connect(slot, **kw) builtins.__dict__['connect_lambda'] = connect_lambda if islinux or ismacos or isfreebsd: # Name all threads at the OS level created using the threading module, see # http://bugs.python.org/issue15500 import threading from calibre_extensions import speedup orig_start = threading.Thread.start def new_start(self): orig_start(self) try: name = self.name if not name or name.startswith('Thread-'): name = self.__class__.__name__ if name == 'Thread': name = self.name if name: if isinstance(name, str): name = name.encode('ascii', 'replace').decode('ascii') speedup.set_thread_name(name[:15]) except Exception: pass # Don't care about failure to set name threading.Thread.start = new_start