Source code for tvb.basic.config.environment
# -*- coding: utf-8 -*-
#
#
# TheVirtualBrain-Scientific Package. This package holds all simulators, and
# analysers necessary to run brain-simulations. You can use it stand alone or
# in conjunction with TheVirtualBrain-Framework Package. 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
#
#
"""
Environment related checks or operations are to be defined here.
.. moduleauthor:: Lia Domide <lia.domide@codemart.ro>
.. moduleauthor:: Mihai Andrei <mihai.andrei@codemart.ro>
"""
import os
import sys
from subprocess import Popen, PIPE
[docs]class Environment(object):
PYTHON_FOLDER = "python%s.%s" % sys.version_info[:2]
[docs] def is_framework_present(self):
"""
:return: True when framework classes are present and can be imported.
"""
framework_present = True
try:
from tvb.config.profile_settings import WebSettingsProfile
except ImportError:
framework_present = False
return framework_present
[docs] @staticmethod
def is_distribution():
"""
Return True when TVB_Distribution package, False when used from a GitHub clone, Pypi, Conda or Docker
"""
try:
import tvb_bin
except ImportError:
# No tvb_bin, it means usage from Pypi or Conda Forge
return False
try:
_proc = Popen(["git", "status"], stdout=PIPE, stderr=PIPE)
if "On branch " in str(_proc.communicate()):
# usage from GitHub clone directly
return False
except Exception:
pass
try:
import tvb
externals_path = os.path.join(
os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(tvb.__file__)))),
"dev_resources")
if os.path.exists(externals_path):
# usage from GitHub clone without got cmd or inside a Docker container (as a mounted volume)
return False
except Exception:
pass
# We default as usage from TVB_Distribution
return True
[docs] def is_linux_deployment(self):
"""
Return True if current run is not development and is running on Linux.
"""
return self.is_linux() and self.is_distribution()
[docs] def is_mac_deployment(self):
"""
Return True if current run is not development and is running on Mac OS X
"""
return self.is_mac() and self.is_distribution()
[docs] def is_windows_deployment(self):
"""
Return True if current run is not development and is running on Windows.
"""
return self.is_windows() and self.is_distribution()
[docs] def is_linux(self):
return not self.is_windows() and not self.is_mac()
[docs] @staticmethod
def is_mac():
return sys.platform == 'darwin'
[docs] @staticmethod
def is_windows():
return sys.platform.startswith('win')
[docs] def get_library_folder(self, default_mac):
"""
Return top level library folder. Will be use for setting paths
"""
if self.is_windows_deployment():
return os.path.dirname(sys.executable)
if self.is_mac_deployment():
return os.path.dirname(default_mac)
if self.is_linux_deployment():
return os.path.dirname(sys.executable)
[docs] def setup_tk_tcl_environ(self, root_folder):
"""
Given a root folder to look in, find the required configuration files for TCL/TK and set the proper
environmental variables so everything works fine in the distribution package.
:param root_folder: the top folder from which to start looking for the required configuration files
"""
tk_folder = self._find_file('tk.tcl', root_folder)
if tk_folder:
os.environ['TK_LIBRARY'] = tk_folder
tcl_folder = self._find_file('init.tcl', root_folder)
if tcl_folder:
os.environ['TCL_LIBRARY'] = tcl_folder
def _find_file(self, target_file, root_folder):
"""
Search for a file in a folder directory. Return the folder in which the file can be found.
:param target_file: the name of the file that is searched
:param root_folder: the top lever folder from which to start searching in all it's subdirectories
:returns: the name of the folder in which the file can be found
"""
for root, _, files in os.walk(root_folder):
for file_n in files:
if file_n == target_file:
return root
[docs] def setup_python_path(self, *paths):
"""
Set PYTHONPATH
:param paths: list of absolute folder paths to join.
"""
os.environ['PYTHONPATH'] = os.pathsep.join(paths)
[docs] def append_to_path(self, *paths):
"""
Set PATH
:param paths: list of absolute folder paths to join and add BEFORE the current PATH
"""
paths = list(paths)
paths.append(os.environ.get('PATH', ''))
os.environ['PATH'] = os.pathsep.join(paths)