calibre/bypy/windows/site.py
2020-08-22 18:47:58 +05:30

85 lines
2.2 KiB
Python

#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
# License: GPLv3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
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.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()