#!/usr/bin/env python # vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai # License: GPLv3 Copyright: 2015, Kovid Goyal import builtins import os import sys from importlib import import_module from importlib.util import spec_from_file_location from importlib.machinery import EXTENSION_SUFFIXES import _sitebuiltins pyd_items = None extension_suffixes = sorted(EXTENSION_SUFFIXES, key=len, reverse=True) def remove_extension_suffix(name): for q in extension_suffixes: if name.endswith(q): return name[:-len(q)] class PydImporter: def find_spec(self, fullname, path, target=None): global pyd_items if pyd_items is None: pyd_items = {} dlls_dir = os.path.join(sys.app_dir, 'app', 'bin') for x in os.listdir(dlls_dir): lx = x.lower() if lx.endswith('.pyd'): pyd_items[remove_extension_suffix(lx)] = os.path.abspath(os.path.join(dlls_dir, x)) q = fullname.lower() path = pyd_items.get(q) if path is not None: return spec_from_file_location(fullname, path) def invalidate_caches(self): global pyd_items pyd_items = None def add_calibre_vars(): dv = os.environ.get('CALIBRE_DEVELOP_FROM', None) if dv and os.path.exists(dv): sys.path.insert(0, os.path.abspath(dv)) def run_entry_point(): bname, mod, func = sys.calibre_basename, sys.calibre_module, sys.calibre_function sys.argv[0] = bname + '.exe' pmod = import_module(mod) return getattr(pmod, func)() def set_helper(): builtins.help = _sitebuiltins._Helper() def set_quit(): eof = 'Ctrl-Z plus Return' builtins.quit = _sitebuiltins.Quitter('quit', eof) builtins.exit = _sitebuiltins.Quitter('exit', eof) def main(): sys.meta_path.insert(0, PydImporter()) os.add_dll_directory(os.path.abspath(os.path.join(sys.app_dir, 'app', 'bin'))) import linecache def fake_getline(filename, lineno, module_globals=None): return '' linecache.orig_getline = linecache.getline linecache.getline = fake_getline add_calibre_vars() set_helper() set_quit() return run_entry_point() if __name__ == '__main__': main()