Source code for koapy.compat.pywinauto.importlib
import importlib
import sys
import warnings
from importlib.abc import Loader, MetaPathFinder
import pythoncom
[docs]class PyWinAutoFinder(MetaPathFinder):
[docs] def find_spec(self, fullname, path, target=None):
if fullname == "pywinauto":
self.unregister()
spec = importlib.util.find_spec(fullname)
spec.loader = PyWinAutoLoader()
return spec
@classmethod
[docs] def register(cls):
sys.meta_path = [cls()] + sys.meta_path
@classmethod
[docs] def unregister(cls):
sys.meta_path = [x for x in sys.meta_path if not isinstance(x, cls)]
[docs]class PyWinAutoLoader(Loader):
def __init__(self):
self._original_coinit_flags_defined = False
self._original_coinit_flags = None
[docs] def set_sys_coinit_flags(self):
self._original_coinit_flags_defined = hasattr(sys, "coinit_flags")
self._original_coinit_flags = getattr(sys, "coinit_flags", None)
sys.coinit_flags = pythoncom.COINIT_APARTMENTTHREADED
[docs] def reset_sys_coinit_flags(self):
if not self._original_coinit_flags_defined:
del sys.coinit_flags
else:
sys.coinit_flags = self._original_coinit_flags
[docs] def create_module(self, spec):
# set sys.coinit_flags = 2
# check https://github.com/pywinauto/pywinauto/issues/472 for more information
self.set_sys_coinit_flags()
# ensure that qt binding is imported before pywinauto import
from koapy.compat import pyside2
# import pywinauto
with warnings.catch_warnings():
warnings.simplefilter("ignore", UserWarning)
module = importlib.import_module(spec.name)
return module
[docs] def exec_module(self, module):
pass