From d8af514a928eb5e15fe714839831a903a0f20585 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 26 May 2019 07:36:00 +0530 Subject: [PATCH] Fix #998 (py3: Load plugins from the same (correct) path) --- src/calibre/constants.py | 9 ++++++--- src/calibre/gui2/__init__.py | 6 +++--- src/calibre/library/sqlite.py | 6 +++--- src/calibre/test_build.py | 4 ++-- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/calibre/constants.py b/src/calibre/constants.py index 7b4e7b4b6f..66ec64b16f 100644 --- a/src/calibre/constants.py +++ b/src/calibre/constants.py @@ -147,6 +147,12 @@ def cache_dir(): ans = cache_dir.ans = _get_cache_dir() return ans + +plugins_loc = sys.extensions_location +if ispy3: + plugins_loc = os.path.join(plugins_loc, '3') + + # plugins {{{ @@ -195,9 +201,6 @@ class Plugins(collections.Mapping): def load_plugin(self, name): if name in self._plugins: return - plugins_loc = sys.extensions_location - if ispy3: - plugins_loc = os.path.join(plugins_loc, '3') sys.path.insert(0, plugins_loc) try: del sys.modules[name] diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 2b94b5fb9b..340a6e7dff 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -22,7 +22,7 @@ from calibre import as_unicode, prints from calibre.constants import ( DEBUG, __appname__ as APP_UID, __version__, config_dir, filesystem_encoding, is_running_from_develop, isbsd, isfrozen, islinux, isosx, iswindows, isxp, - plugins + plugins, plugins_loc ) from calibre.ebooks.metadata import MetaInformation from calibre.gui2.linux_file_dialogs import ( @@ -821,7 +821,7 @@ class Application(QApplication): if headless: if not args: args = sys.argv[:1] - args.extend(['-platformpluginpath', sys.extensions_location, '-platform', 'headless']) + args.extend(['-platformpluginpath', plugins_loc, '-platform', 'headless']) self.headless = headless qargs = [i.encode('utf-8') if isinstance(i, unicode_type) else i for i in args] self.pi, pi_err = plugins['progress_indicator'] @@ -1167,7 +1167,7 @@ def ensure_app(headless=True): args = sys.argv[:1] has_headless = isosx or islinux or isbsd if headless and has_headless: - args += ['-platformpluginpath', sys.extensions_location, '-platform', 'headless'] + args += ['-platformpluginpath', plugins_loc, '-platform', 'headless'] _store_app = QApplication(args) if headless and has_headless: _store_app.headless = True diff --git a/src/calibre/library/sqlite.py b/src/calibre/library/sqlite.py index dbae07675d..cbc1786d47 100644 --- a/src/calibre/library/sqlite.py +++ b/src/calibre/library/sqlite.py @@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en' Wrapper for multi-threaded access to a single sqlite database connection. Serializes all calls. ''' -import sqlite3 as sqlite, traceback, time, uuid, sys, os +import sqlite3 as sqlite, traceback, time, uuid, os from sqlite3 import IntegrityError, OperationalError from threading import Thread from threading import RLock @@ -17,7 +17,7 @@ from functools import partial from calibre.ebooks.metadata import title_sort, author_to_author_sort from calibre.utils.date import parse_date, isoformat, local_tz, UNDEFINED_DATE from calibre import isbytestring, force_unicode -from calibre.constants import iswindows, DEBUG, plugins +from calibre.constants import iswindows, DEBUG, plugins, plugins_loc from calibre.utils.icu import sort_key from calibre import prints from polyglot.builtins import unicode_type, cmp @@ -238,7 +238,7 @@ def icu_collator(s1, s2): def load_c_extensions(conn, debug=DEBUG): try: conn.enable_load_extension(True) - ext_path = os.path.join(sys.extensions_location, 'sqlite_custom.'+ + ext_path = os.path.join(plugins_loc, 'sqlite_custom.'+ ('pyd' if iswindows else 'so')) conn.load_extension(ext_path) conn.enable_load_extension(False) diff --git a/src/calibre/test_build.py b/src/calibre/test_build.py index 84aaa87a2c..209e6f881b 100644 --- a/src/calibre/test_build.py +++ b/src/calibre/test_build.py @@ -13,7 +13,7 @@ Test a binary calibre build to ensure that all needed binary images/libraries ha import os, ctypes, sys, unittest, time -from calibre.constants import plugins, iswindows, islinux, isosx, ispy3 +from calibre.constants import plugins, iswindows, islinux, isosx, ispy3, plugins_loc from polyglot.builtins import iteritems, map, unicode_type, getenv, native_string_type is_ci = os.environ.get('CI', '').lower() == 'true' @@ -103,7 +103,7 @@ class BuildTest(unittest.TestCase): if name in exclusions: if name in ('libusb', 'libmtp'): # Just check that the DLL can be loaded - ctypes.CDLL(os.path.join(sys.extensions_location, name + ('.dylib' if isosx else '.so'))) + ctypes.CDLL(os.path.join(plugins_loc, name + ('.dylib' if isosx else '.so'))) continue mod, err = plugins[name] self.assertFalse(err or not mod, 'Failed to load plugin: ' + name + ' with error:\n' + err)