Source code for astropy.config.paths

# Licensed under a 3-clause BSD style license - see LICENSE.rst
""" This module contains functions to determine where configuration and
data/cache files used by Astropy should be placed.
"""

from __future__ import division

__all__ = ['get_config_dir', 'get_cache_dir']


def _find_home():
    """ Locates and return the home directory (or best approximation) on this
    system.

    Raises
    ------
    OSError
        If the home directory cannot be located - usually means you are running
        Astropy on some obscure platform that doesn't have standard home
        directories.
    """
    import os
    import sys
    from os import environ as env

    # this is used below to make fix up encoding issues that sometimes crop up
    # in py2.x but not in py3.x
    if sys.version_info[0] < 3:  # pragma: py3
        decodepath = lambda pth: pth.decode(sys.getfilesystemencoding())
    else:  # pragma: py2
        decodepath = lambda pth: pth

    #First find the home directory - this is inspired by the scheme ipython
    #uses to identify "home"
    if os.name == 'posix':
        # Linux, Unix, AIX, OS X
        if 'HOME' in env:
            homedir = decodepath(env['HOME'])
        else:
            raise OSError('Could not find unix home directory to search for' +\
                          ' astropy config dir')
    elif os.name == 'nt':  # This is for all modern Windows (NT or after)
        #Try for a network home first
        if 'HOMESHARE' in env:
            homedir = decodepath(env['HOMESHARE'])
        #See if there's a local home
        elif 'HOMEDRIVE' in env and 'HOMEPATH' in env:
            homedir = os.path.join(env['HOMEDRIVE'], env['HOMEPATH'])
            homedir = decodepath(homedir)
        #Maybe a user profile?
        elif 'USERPROFILE' in env:
            homedir = decodepath(os.path.join(env['USERPROFILE']))
        else:
            try:
                import _winreg as wreg
                key = wreg.OpenKey(wreg.HKEY_CURRENT_USER,
            'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders')

                homedir = wreg.QueryValueEx(key, 'Personal')[0]
                homedir = decodepath(homedir)
                key.Close()
            except:
                #As a final possible resort, see if HOME is present
                if 'HOME' in env:
                    homedir = decodepath(env['HOME'])
                else:
                    raise OSError('Could not find windows home directory to' +\
                                  ' search for astropy config dir')
    else:
        #for other platforms, try HOME, although it probably isn't there
        if 'HOME' in env:
            homedir = decodepath(env['HOME'])
        else:
            raise OSError('Could not find a home directory to search for ' +\
                 'astropy config dir - are you on an unspported platform?')
    return homedir


[docs]def get_config_dir(create=True): """ Determines the Astropy configuration directory name and creates the directory if it doesn't exist. This directory is typically ``$HOME/.astropy/config``, but if the XDG_CONFIG_HOME environment variable is set and the ``$XDG_CONFIG_HOME/astropy`` directory exists, it will be that directory. If neither exists, the former will be created and symlinked to the latter. Returns ------- configdir : str The absolute path to the configuration directory. """ from os import path, environ #symlink will be set to this if the directory is created linkto = None #first look for XDG_CONFIG_HOME xch = environ.get('XDG_CONFIG_HOME') if xch is not None and path.exists(xch): xchpth = path.join(xch, 'astropy') if not path.islink(xchpth): if path.exists(xchpth): return path.abspath(xchpth) else: linkto = xchpth return path.abspath(_find_or_create_astropy_dir('config', linkto))
[docs]def get_cache_dir(): """ Determines the Astropy cache directory name and creates the directory if it doesn't exist. This directory is typically ``$HOME/.astropy/cache``, but if the XDG_CACHE_HOME environment variable is set and the ``$XDG_CACHE_HOME/astropy`` directory exists, it will be that directory. If neither exists, the former will be created and symlinked to the latter. Returns ------- cachedir : str The absolute path to the cache directory. """ from os import path, environ #symlink will be set to this if the directory is created linkto = None #first look for XDG_CACHE_HOME xch = environ.get('XDG_CACHE_HOME') if xch is not None and path.exists(xch): xchpth = path.join(xch, 'astropy') if not path.islink(xchpth): if path.exists(xchpth): return path.abspath(xchpth) else: linkto = xchpth return path.abspath(_find_or_create_astropy_dir('cache', linkto))
def _find_or_create_astropy_dir(dirnm, linkto): from os import path, mkdir import sys innerdir = path.join(_find_home(), '.astropy') maindir = path.join(_find_home(), '.astropy', dirnm) if not path.exists(maindir): #first create .astropy dir if needed if not path.exists(innerdir): mkdir(innerdir) elif not path.isdir(innerdir): msg = 'Intended Astropy directory {0} is actually a file.' raise IOError(msg.format(innerdir)) mkdir(maindir) if (not sys.platform.startswith('win') and linkto is not None and not path.exists(linkto)): from os import symlink symlink(maindir, linkto) elif not path.isdir(maindir): msg = 'Intended Astropy {0} directory {1} is actually a file.' raise IOError(msg.format(dirnm, maindir)) return path.abspath(maindir)

Page Contents