From 4de71eb662024473416104c16b0efedcd30a10de Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Mon, 2 Nov 2020 21:34:48 +1000 Subject: [PATCH] fix pywintypes issue when running tests on Windows --- qt/BUILD.bazel | 8 ++++++-- qt/bazelfixes.py | 37 ++++++++++++++++++++++++++++++++++++ qt/runanki.py | 43 ++++++------------------------------------ qt/tests/run_pytest.py | 7 +++++++ 4 files changed, 56 insertions(+), 39 deletions(-) create mode 100644 qt/bazelfixes.py diff --git a/qt/BUILD.bazel b/qt/BUILD.bazel index ca14f591a..57ec068b2 100644 --- a/qt/BUILD.bazel +++ b/qt/BUILD.bazel @@ -26,10 +26,11 @@ py_binary( py_test( name = "pytest", - srcs = glob(["tests/*.py"]), + srcs = glob(["tests/*.py"]) + ["bazelfixes.py"], data = [ "//qt/aqt_data", ], + imports = ["."], main = "tests/run_pytest.py", deps = [ "//pylib/anki", @@ -123,7 +124,10 @@ py_binary( py_binary( name = "runanki", - srcs = ["runanki.py"], + srcs = [ + "bazelfixes.py", + "runanki.py", + ], data = [ "//qt/aqt_data", ], diff --git a/qt/bazelfixes.py b/qt/bazelfixes.py new file mode 100644 index 000000000..d79848f78 --- /dev/null +++ b/qt/bazelfixes.py @@ -0,0 +1,37 @@ +import os +import sys + +def fix_pywin32_in_bazel(force=False): + if sys.platform != "win32": + return + if not force and "BAZEL_SH" not in os.environ: + return + + import imp + + # get path to pywin32 package + path = None + for path in sys.path: + if "pywin32" in path: + break + + # trigger pywin32 bootstrap + import site + site.addsitedir(path) + + # sys.path has been extended; use final + # path to locate dll folder and add it to path + path = sys.path[-1] + path = path.replace("Pythonwin", "pywin32_system32") + os.environ["PATH"] += ";" + path + + # import pythoncom module + filename = os.path.join(path, "pythoncom38.dll") + mod = imp.load_module("pythoncom", None, filename, + ('.dll', 'rb', imp.C_EXTENSION)) + + +def fix_extraneous_path_in_bazel(): + # source folder conflicts with bazel-out source + if sys.path[0].endswith("qt"): + del sys.path[0] diff --git a/qt/runanki.py b/qt/runanki.py index 68976a575..d57d85dca 100644 --- a/qt/runanki.py +++ b/qt/runanki.py @@ -2,44 +2,13 @@ import os import sys +try: + import bazelfixes -def fix_pywin32_in_bazel(): - if sys.platform != "win32": - return - if "BAZEL_SH" not in os.environ: - return - - import imp - - # get path to pywin32 package - path = None - for path in sys.path: - if "pywin32" in path: - break - - # trigger pywin32 bootstrap - import site - site.addsitedir(path) - - # sys.path has been extended; use final - # path to locate dll folder and add it to path - path = sys.path[-1] - path = path.replace("Pythonwin", "pywin32_system32") - os.environ["PATH"] += ";" + path - - # import pythoncom module - filename = os.path.join(path, "pythoncom38.dll") - mod = imp.load_module("pythoncom", None, filename, - ('.dll', 'rb', imp.C_EXTENSION)) - - -def fix_extraneous_path_in_bazel(): - # source folder conflicts with bazel-out source - if sys.path[0].endswith("qt"): - del sys.path[0] - -fix_pywin32_in_bazel() -fix_extraneous_path_in_bazel() + bazelfixes.fix_pywin32_in_bazel() + bazelfixes.fix_extraneous_path_in_bazel() +except ImportError: + pass import aqt diff --git a/qt/tests/run_pytest.py b/qt/tests/run_pytest.py index 1d106a419..1a2613e5b 100644 --- a/qt/tests/run_pytest.py +++ b/qt/tests/run_pytest.py @@ -3,6 +3,13 @@ import sys import pytest +try: + import bazelfixes + + bazelfixes.fix_pywin32_in_bazel(force=True) +except ImportError: + pass + if __name__ == "__main__": print(os.path.dirname(__file__)) folder = os.path.join(os.path.dirname(__file__), "..", "tests")