Source code for tvb.core.decorators

# -*- coding: utf-8 -*-
#
#
# TheVirtualBrain-Framework Package. This package holds all Data Management, and 
# Web-UI helpful to run brain-simulations. To use it, you also need to download
# TheVirtualBrain-Scientific Package (for simulators). See content of the
# documentation-folder for more details. See also http://www.thevirtualbrain.org
#
# (c) 2012-2023, Baycrest Centre for Geriatric Care ("Baycrest") and others
#
# This program is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software Foundation,
# either version 3 of the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.  See the GNU General Public License for more details.
# You should have received a copy of the GNU General Public License along with this
# program.  If not, see <http://www.gnu.org/licenses/>.
#
#
#   CITATION:
# When using The Virtual Brain for scientific publications, please cite it as explained here:
# https://www.thevirtualbrain.org/tvb/zwei/neuroscience-publications
#
#

"""
.. moduleauthor:: Bogdan Neacsa <bogdan.neacsa@codemart.ro>
"""

import os
from tvb.basic.config.environment import Environment


[docs]def user_environment_execution(func): """ Decorator that makes sure a function is executed in a 'user' environment, removing any TVB specific configurations that alter either LD_LIBRARY_PATH or LD_RUN_PATH. """ def _remove_from_path(env_name, count, segment_marker): """ For 'env_name' environment variable representing a path (e.g. LB_RUN_PATH), remove first 'count' segments. Remove only those path segments within the limit of 'count' and containing 'segment_marker'. Set the value without the removed segments as environment variables instead of the previous one. :return: original 'env_name' value, for possibility of revert. """ original_path = os.environ.get(env_name, None) if not original_path: return original_path path_segments = original_path.split(os.pathsep) new_path = original_path for i in range(min(count, len(path_segments))): segment = path_segments[i] if segment_marker in segment: new_path = new_path.replace(segment + os.pathsep, '', 1) os.environ[env_name] = new_path return original_path def new_function(*args, **kwargs): """ Wrapper function for Linux TVB altered environment variables. Apply this only on Linux, as that is the only env in which TVB start scripts alter LD_*_PATH env vars. :return: Result of the wrapped function """ if not Environment().is_linux_deployment(): # Do nothing return func(*args, **kwargs) original_ld_library_path = _remove_from_path('LD_LIBRARY_PATH', 2, 'tvb_data') original_ld_run_path = _remove_from_path('LD_RUN_PATH', 2, 'tvb_data') result = func(*args, **kwargs) ## Restore environment settings after function executed. if original_ld_library_path: os.environ['LD_LIBRARY_PATH'] = original_ld_library_path if original_ld_run_path: os.environ['LD_RUN_PATH'] = original_ld_run_path return result return new_function