Skip to content

Commit

Permalink
Add plugins.py module with load_plugin_on_server helper (#1600)
Browse files Browse the repository at this point in the history
* Add plugins.py module with load_plugin_on_server helper.

Signed-off-by: paul.profizi <paul.profizi@ansys.com>

* Retro-compatible importlib import

---------

Signed-off-by: paul.profizi <paul.profizi@ansys.com>
  • Loading branch information
PProfizi authored Jun 4, 2024
1 parent 918c515 commit a5364b1
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/ansys/dpf/core/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
config_options
)
from ansys.dpf.core import help
from ansys.dpf.core import plugins
from ansys.dpf.core.core import (
BaseService,
load_library,
Expand Down
80 changes: 80 additions & 0 deletions src/ansys/dpf/core/plugins.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
"""
Python DPF plugins utilities
============================
Contains the utilities specific to installing and using Python DPF plugins.
"""
import os.path
try:
import importlib.metadata as importlib_metadata
except ImportError: # Python < 3.10 (backport)
import importlib_metadata as importlib_metadata

import ansys.dpf.core as dpf
from ansys.dpf.core import server as server_module


def load_plugin_on_server(plugin, server=None, symbol="load_operators"):
"""Load a DPF Python plugin on the global or given DPF server.
Parameters
----------
plugin:
DPF Python plugin to load.
server:
DPF server to load the plugin onto.
symbol:
Name of the function recording the operators in the plugin.
"""
server = server_module.get_or_create_server(server)
plugin_name = plugin.split("-")[-1]
tmp_folder = dpf.make_tmp_dir_server(server=server)

# Get the path to the plugin from the package installation
if len([p for p in importlib_metadata.files(plugin) if "__init__.py" in str(p)]) > 0:
file_path = [p for p in importlib_metadata.files(plugin) if "__init__.py" in str(p)][0]
plugin_path = str(os.path.dirname(file_path.locate()))
# For some reason the "locate()" function returns a path with src doubled
plugin_path = plugin_path.replace("src"+os.path.sep+"src", "src")
elif len([p for p in importlib_metadata.files(plugin) if ".pth" in str(p)]) > 0:
path_file = [p for p in importlib_metadata.files(plugin) if ".pth" in str(p)][0].locate()
with open(path_file, "r") as file:
plugin_path = file.readline()[:-1]
plugin_path = os.path.join(plugin_path, "ansys", "dpf", "plugins", plugin_name)
else:
raise ModuleNotFoundError(f"Could not locate files for plugin {plugin}")

target_plugin_path = dpf.path_utilities.join(tmp_folder, "ansys", "dpf", "plugins", plugin_name)
target_xml_path = dpf.path_utilities.join(tmp_folder, "ansys", "dpf", "plugins")

# Upload python files
_ = dpf.upload_files_in_folder(
target_plugin_path,
plugin_path,
specific_extension=".py",
server=server,
)

# upload zip files (site-packages)
_ = dpf.upload_files_in_folder(
target_plugin_path,
plugin_path,
specific_extension=".zip",
server=server,
)

# Upload xml file for the plugin
_ = dpf.upload_files_in_folder(
target_xml_path,
os.path.join(plugin_path, os.pardir),
specific_extension=".xml",
server=server,
)

# Load the plugin on the server
dpf.load_library(
filename=target_plugin_path,
name=f"py_{plugin_name}",
symbol=symbol,
server=server,
)

0 comments on commit a5364b1

Please sign in to comment.