From 2a91a16d2af8ddd7b98d7e9d6ea27c05b34fb2f9 Mon Sep 17 00:00:00 2001 From: Dmitri Plotnikov Date: Wed, 4 Feb 2026 11:33:19 -0800 Subject: [PATCH] Make protobuf dependency optional. Part II PiperOrigin-RevId: 865503087 --- py_cel_test.py | 9 +++++---- py_message_factory.cc | 12 ++++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/py_cel_test.py b/py_cel_test.py index 36924a0..5ca4515 100644 --- a/py_cel_test.py +++ b/py_cel_test.py @@ -812,15 +812,16 @@ def setUp(self): self.msg = test_all_types_pb.TestAllTypes() self.msg.single_string = "Hey" - # "Unimport" descriptor_pool if it is already imported. - if "google.protobuf.descriptor_pool" in sys.modules: - del sys.modules["google.protobuf.descriptor_pool"] + # "Unimport" any google.protobuf modules if they are already imported. + for module_name in list(sys.modules): + if module_name.startswith("google.protobuf"): + del sys.modules[module_name] # Make it impossible to import descriptor_pool. class UnluckyFinder(importlib.abc.MetaPathFinder): def find_spec(self, fullname, unused_path, unused_target=None): - if fullname == "google.protobuf.descriptor_pool": + if fullname.startswith("google.protobuf."): raise ImportError("Not found") return None diff --git a/py_message_factory.cc b/py_message_factory.cc index b2ff6de..ef0f641 100644 --- a/py_message_factory.cc +++ b/py_message_factory.cc @@ -26,6 +26,10 @@ namespace cel_python { PyMessageFactory::PyMessageFactory(PyObject* descriptor_pool) { py_descriptor_pool_ = descriptor_pool; + if (py_descriptor_pool_ == nullptr) { + return; + } + Py_XINCREF(py_descriptor_pool_); PyObject* pName = PyUnicode_DecodeFSDefault("google.protobuf.message_factory"); @@ -44,6 +48,10 @@ PyMessageFactory::PyMessageFactory(PyObject* descriptor_pool) { } PyMessageFactory::~PyMessageFactory() { + if (py_descriptor_pool_ == nullptr) { + return; + } + auto gil_state = PyGILState_Ensure(); Py_XDECREF(py_descriptor_pool_); Py_XDECREF(py_func_GetMessageClass_); @@ -91,6 +99,10 @@ PyObject* PyMessageFactory::GetMessageClass(const std::string& message_type) { PyObject* PyMessageFactory::FromString(const std::string& message_type, const std::string& serialized_proto) { + if (py_descriptor_pool_ == nullptr) { + return nullptr; + } + ABSL_CHECK(PyGILState_Check()); PyObject* message_class = GetMessageClass(message_type); if (!message_class) {