Source code for schrodinger.job.util

"""
Contains a utility to find a product within a SCHRODINGER directory.

@copyright: Schrodinger, LLC. All rights reserved.
"""

import enum
import glob
import os


[docs]@enum.unique class DirectoryType(enum.Enum): EXEC = "exec" LIB = "lib" DATA = "data"
[docs]def hunt(product, dir=DirectoryType.EXEC): """ Look for the exec, lib, or data directory for a given Schrodinger product. :param dir: The type of directory to find; must be 'exec', 'lib', or 'data' and defaults to 'exec'. :type dir: DirectoryType :return: The executable, lib, or data directory of the desired product. If no directory is found, the empty string is returned. :rtype: str """ # dir is an unfortunate name but it is used in calling conventions if not isinstance(dir, DirectoryType): try: directory = DirectoryType[dir.upper()] except KeyError: raise TypeError("dir ({}) needs to be one of DirectoryTypes") else: directory = dir globpattern = "{}/{}-v*/bin/[A-Z]*".format(os.environ.get("SCHRODINGER"), product) execdirs = [d for d in glob.glob(globpattern) if os.path.isdir(d)] if execdirs: exec_dir = execdirs[0] else: return "" if directory == DirectoryType.EXEC: return exec_dir bin_dir, os_cpu = os.path.split(exec_dir) base_dir = os.path.dirname(bin_dir) if not base_dir: return "" if directory == DirectoryType.LIB: return os.path.join(base_dir, "lib", os_cpu) elif directory == DirectoryType.DATA: return os.path.join(base_dir, "data")