Merge remote-tracking branch 'origin/enhancement/OP-2787_Maya-ABC-farm-publishing' into enhancement/OP-2787_Maya-ABC-farm-publishing

This commit is contained in:
Petr Kalis 2022-05-20 18:16:00 +02:00
commit eba7fc33f7
4 changed files with 81 additions and 48 deletions

View file

@ -1282,7 +1282,13 @@ class EnvironmentPrepData(dict):
def get_app_environments_for_context(
project_name, asset_name, task_name, app_name, env_group=None, env=None
project_name,
asset_name,
task_name,
app_name,
env_group=None,
env=None,
modules_manager=None
):
"""Prepare environment variables by context.
Args:
@ -1293,10 +1299,12 @@ def get_app_environments_for_context(
by ApplicationManager.
env (dict): Initial environment variables. `os.environ` is used when
not passed.
modules_manager (ModulesManager): Initialized modules manager.
Returns:
dict: Environments for passed context and application.
"""
from openpype.pipeline import AvalonMongoDB
# Avalon database connection
@ -1311,6 +1319,11 @@ def get_app_environments_for_context(
"name": asset_name
})
if modules_manager is None:
from openpype.modules import ModulesManager
modules_manager = ModulesManager()
# Prepare app object which can be obtained only from ApplciationManager
app_manager = ApplicationManager()
app = app_manager.applications[app_name]
@ -1334,7 +1347,7 @@ def get_app_environments_for_context(
"env": env
})
prepare_app_environments(data, env_group)
prepare_app_environments(data, env_group, modules_manager)
prepare_context_environments(data, env_group)
# Discard avalon connection
@ -1355,9 +1368,12 @@ def _merge_env(env, current_env):
return result
def _add_python_version_paths(app, env, logger):
def _add_python_version_paths(app, env, logger, modules_manager):
"""Add vendor packages specific for a Python version."""
for module in modules_manager.get_enabled_modules():
module.modify_application_launch_arguments(app, env)
# Skip adding if host name is not set
if not app.host_name:
return
@ -1390,7 +1406,9 @@ def _add_python_version_paths(app, env, logger):
env["PYTHONPATH"] = os.pathsep.join(python_paths)
def prepare_app_environments(data, env_group=None, implementation_envs=True):
def prepare_app_environments(
data, env_group=None, implementation_envs=True, modules_manager=None
):
"""Modify launch environments based on launched app and context.
Args:
@ -1403,7 +1421,12 @@ def prepare_app_environments(data, env_group=None, implementation_envs=True):
log = data["log"]
source_env = data["env"].copy()
_add_python_version_paths(app, source_env, log)
if modules_manager is None:
from openpype.modules import ModulesManager
modules_manager = ModulesManager()
_add_python_version_paths(app, source_env, log, modules_manager)
# Use environments from local settings
filtered_local_envs = {}

View file

@ -370,6 +370,7 @@ def _load_modules():
class _OpenPypeInterfaceMeta(ABCMeta):
"""OpenPypeInterface meta class to print proper string."""
def __str__(self):
return "<'OpenPypeInterface.{}'>".format(self.__name__)
@ -388,6 +389,7 @@ class OpenPypeInterface:
OpenPype modules which means they have to have implemented methods defined
in the interface. By default interface does not have any abstract parts.
"""
pass
@ -432,10 +434,12 @@ class OpenPypeModule:
It is not recommended to override __init__ that's why specific method
was implemented.
"""
pass
def connect_with_modules(self, enabled_modules):
"""Connect with other enabled modules."""
pass
def get_global_environments(self):
@ -443,8 +447,22 @@ class OpenPypeModule:
Environment variables that can be get only from system settings.
"""
return {}
def modify_application_launch_arguments(self, application, env):
"""Give option to modify launch environments before application launch.
Implementation is optional. To change environments modify passed
dictionary of environments.
Args:
application (Application): Application that is launched.
env (dict): Current environemnt variables.
"""
pass
def cli(self, module_click_group):
"""Add commands to click group.
@ -465,6 +483,7 @@ class OpenPypeModule:
def mycommand():
print("my_command")
"""
pass

View file

@ -88,6 +88,40 @@ class FtrackModule(
"""Implementation of `ILaunchHookPaths`."""
return os.path.join(FTRACK_MODULE_DIR, "launch_hooks")
def modify_application_launch_arguments(self, application, env):
if not application.use_python_2:
return
self.log.info("Adding Ftrack Python 2 packages to PYTHONPATH.")
# Prepare vendor dir path
python_2_vendor = os.path.join(FTRACK_MODULE_DIR, "python2_vendor")
# Add Python 2 modules
python_paths = [
# `python-ftrack-api`
os.path.join(python_2_vendor, "ftrack-python-api", "source"),
# `arrow`
os.path.join(python_2_vendor, "arrow"),
# `builtins` from `python-future`
# - `python-future` is strict Python 2 module that cause crashes
# of Python 3 scripts executed through OpenPype
# (burnin script etc.)
os.path.join(python_2_vendor, "builtins"),
# `backports.functools_lru_cache`
os.path.join(
python_2_vendor, "backports.functools_lru_cache"
)
]
# Load PYTHONPATH from current launch context
python_path = env.get("PYTHONPATH")
if python_path:
python_paths.append(python_path)
# Set new PYTHONPATH to launch context environments
env["PYTHONPATH"] = os.pathsep.join(python_paths)
def connect_with_modules(self, enabled_modules):
for module in enabled_modules:
if not hasattr(module, "get_ftrack_event_handler_paths"):

View file

@ -1,43 +0,0 @@
import os
from openpype.lib import PreLaunchHook
from openpype_modules.ftrack import FTRACK_MODULE_DIR
class PrePython2Support(PreLaunchHook):
"""Add python ftrack api module for Python 2 to PYTHONPATH.
Path to vendor modules is added to the beggining of PYTHONPATH.
"""
def execute(self):
if not self.application.use_python_2:
return
self.log.info("Adding Ftrack Python 2 packages to PYTHONPATH.")
# Prepare vendor dir path
python_2_vendor = os.path.join(FTRACK_MODULE_DIR, "python2_vendor")
# Add Python 2 modules
python_paths = [
# `python-ftrack-api`
os.path.join(python_2_vendor, "ftrack-python-api", "source"),
# `arrow`
os.path.join(python_2_vendor, "arrow"),
# `builtins` from `python-future`
# - `python-future` is strict Python 2 module that cause crashes
# of Python 3 scripts executed through OpenPype (burnin script etc.)
os.path.join(python_2_vendor, "builtins"),
# `backports.functools_lru_cache`
os.path.join(
python_2_vendor, "backports.functools_lru_cache"
)
]
# Load PYTHONPATH from current launch context
python_path = self.launch_context.env.get("PYTHONPATH")
if python_path:
python_paths.append(python_path)
# Set new PYTHONPATH to launch context environments
self.launch_context.env["PYTHONPATH"] = os.pathsep.join(python_paths)