From 791cda7c16d27d88228a7812b5512fd5aac0c0ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Noel?= Date: Thu, 31 Jul 2025 16:50:28 +0200 Subject: [PATCH] Get varlink's interface description file using importlib.resources.files This will prevent issues with packed packages. Available since py39 and f080d4b3abd97e5f5da931ba3803f66fff1fdb6d dropped support of older versions. --- varlink/client.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/varlink/client.py b/varlink/client.py index b330002..2b60e7e 100644 --- a/varlink/client.py +++ b/varlink/client.py @@ -1,3 +1,5 @@ +import functools +import importlib.resources import json import os import shutil @@ -327,6 +329,13 @@ class Client: handler = SimpleClientInterfaceHandler + @classmethod + @functools.lru_cache(maxsize=1) + def _get_base_interface(cls): + return Interface( + importlib.resources.files("varlink").joinpath("org.varlink.service.varlink").read_text() + ) + def __init__(self, address=None, resolve_interface=None, resolver=None): """Creates a Client object to reach the interfaces of a varlink service. For more constructors see the class constructor methods new_with_*() returning an Client object. @@ -344,9 +353,7 @@ def __init__(self, address=None, resolve_interface=None, resolver=None): self._child_pid = 0 self._str = "Client" - with open(os.path.join(os.path.dirname(__file__), "org.varlink.service.varlink")) as f: - interface = Interface(f.read()) - self.add_interface(interface) + self.add_interface(self._get_base_interface()) if resolve_interface: self._with_interface(resolve_interface, resolver)