Skip to main content

A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".

Project description

This is a fork and almost drop-in replacement of appdirs that follows the XDG BaseDir Spec on macOS when the relevant XDG_* environment variables are available. For instance, on macOS, when XDG_CONFIG_HOME is set to /Users/steve/.config, user_config_dir('foo') evaluates to /Users/steve/.config/foo, whereas when XDG_CONFIG_HOME is not set or empty, it evaluates to /Users/steve/Library/Application Support/foo. This gives XDG fans a choice while not mandating .config for everyone else, especially for GUI apps.

Other changes:

  • Reverts ActiveState/appdirs#100. On macOS, user_config_dir and site_config_dir evaluates to subdirs of ~/Library/Application Support and /Library/Application Support (unless the relevant XDG_* env vars are set and non-empty), rather than subdirs of ~/Library/Preferences and /Library/Preferences, which are specifically for plists and not suitable for anything else. You don’t need appdirs to tell you where to write plists.

  • Properly handle empty XDG_* env vars. According to XDG BaseDir Spec, defaults should be used when the env vars are empty.

  • Support for returning pathlib.Path ([contributed]( by @pmav99).

The original README for appdirs follows.

the problem

What directory should your app use for storing user data? If running on macOS, you should use:

~/Library/Application Support/<AppName>

If on Windows (at least English Win XP) that should be:

C:\Documents and Settings\<User>\Application Data\Local Settings\<AppAuthor>\<AppName>

or possibly:

C:\Documents and Settings\<User>\Application Data\<AppAuthor>\<AppName>

for roaming profiles but that is another story.

On Linux (and other Unices) the dir, according to the XDG spec, is:


appdirs to the rescue

This kind of thing is what the appdirs module is for. appdirs will help you choose an appropriate:

  • user data dir (user_data_dir)

  • user config dir (user_config_dir)

  • user cache dir (user_cache_dir)

  • site data dir (site_data_dir)

  • site config dir (site_config_dir)

  • user log dir (user_log_dir)

and also:

  • is a single module so other Python packages can include their own private copy

  • is slightly opinionated on the directory names used. Look for “OPINION” in documentation and code for when an opinion is being applied.

some example output

On macOS:

>>> from appdirs import *
>>> appname = "SuperApp"
>>> appauthor = "Acme"
>>> user_data_dir(appname, appauthor)
'/Users/trentm/Library/Application Support/SuperApp'
>>> site_data_dir(appname, appauthor)
'/Library/Application Support/SuperApp'
>>> user_cache_dir(appname, appauthor)
>>> user_log_dir(appname, appauthor)

On Windows 7:

>>> from appdirs import *
>>> appname = "SuperApp"
>>> appauthor = "Acme"
>>> user_data_dir(appname, appauthor)
>>> user_data_dir(appname, appauthor, roaming=True)
>>> user_cache_dir(appname, appauthor)
>>> user_log_dir(appname, appauthor)

On Linux:

>>> from appdirs import *
>>> appname = "SuperApp"
>>> appauthor = "Acme"
>>> user_data_dir(appname, appauthor)
>>> site_data_dir(appname, appauthor)
>>> site_data_dir(appname, appauthor, multipath=True)
>>> user_cache_dir(appname, appauthor)
>>> user_log_dir(appname, appauthor)
>>> user_config_dir(appname)
>>> site_config_dir(appname)
>>> os.environ['XDG_CONFIG_DIRS'] = '/etc:/usr/local/etc'
>>> site_config_dir(appname, multipath=True)

AppDirs for convenience

>>> from appdirs import AppDirs
>>> dirs = AppDirs("SuperApp", "Acme")
>>> dirs.user_data_dir
'/Users/trentm/Library/Application Support/SuperApp'
>>> dirs.site_data_dir
'/Library/Application Support/SuperApp'
>>> dirs.user_cache_dir
>>> dirs.user_log_dir

Per-version isolation

If you have multiple versions of your app in use that you want to be able to run side-by-side, then you may want version-isolation for these dirs:

>>> from appdirs import AppDirs
>>> dirs = AppDirs("SuperApp", "Acme", version="1.0")
>>> dirs.user_data_dir
'/Users/trentm/Library/Application Support/SuperApp/1.0'
>>> dirs.site_data_dir
'/Library/Application Support/SuperApp/1.0'
>>> dirs.user_cache_dir
>>> dirs.user_log_dir

appdirs Changelog

xdgappdirs 1.4.5

  • Add support for returning pathlib.Path (#1).


  • Rename module to xdgappdirs to allow coexistence with appdirs.

xdgappdirs 1.4.4

  • Deviate from appdirs (see top of README)

  • [PR #92] Don’t import appdirs from which resolves issue #91

  • Add Python 3.7 support

  • Remove support for end-of-life Pythons 2.6, 3.2, and 3.3

Project officially classified as Stable which is important for inclusion in other distros such as ActivePython.

appdirs 1.4.3

  • [PR #76] Python 3.6 invalid escape sequence deprecation fixes

  • Fix for Python 3.6 support

appdirs 1.4.2

  • [PR #84] Allow installing without setuptools

  • [PR #86] Fix string delimiters in description

  • Add Python 3.6 support

appdirs 1.4.1

  • [issue #38] Fix _winreg import on Windows Py3

  • [issue #55] Make appname optional

appdirs 1.4.0

  • [PR #42] AppAuthor is now optional on Windows

  • [issue 41] Support Jython on Windows, Mac, and Unix-like platforms. Windows support requires JNA.

  • [PR #44] Fix incorrect behaviour of the site_config_dir method

appdirs 1.3.0

  • [Unix, issue 16] Conform to XDG standard, instead of breaking it for everybody

  • [Unix] Removes gratuitous case mangling of the case, since *nix-es are usually case sensitive, so mangling is not wise

  • [Unix] Fixes the utterly wrong behaviour in site_data_dir, return result based on XDG_DATA_DIRS and make room for respecting the standard which specifies XDG_DATA_DIRS is a multiple-value variable

  • [Issue 6] Add *_config_dir which are distinct on nix-es, according to XDG specs; on Windows and Mac return the corresponding *_data_dir

appdirs 1.2.0

  • [Unix] Put user_log_dir under the cache dir on Unix. Seems to be more typical.

  • [issue 9] Make unicode work on py3k.

appdirs 1.1.0

  • [issue 4] Add AppDirs.user_log_dir.

  • [Unix, issue 2, issue 7] appdirs now conforms to XDG base directory spec.

  • [Mac, issue 5] Fix site_data_dir() on Mac.

  • [Mac] Drop use of ‘Carbon’ module in favour of hardcoded paths; supports Python3 now.

  • [Windows] Append “Cache” to user_cache_dir on Windows by default. Use opinion=False option to disable this.

  • Add appdirs.AppDirs convenience class. Usage:

    >>> dirs = AppDirs("SuperApp", "Acme", version="1.0")
    >>> dirs.user_data_dir
    '/Users/trentm/Library/Application Support/SuperApp/1.0'
  • [Windows] Cherry-pick Komodo’s change to downgrade paths to the Windows short paths if there are high bit chars.

  • [Linux] Change default user_cache_dir() on Linux to be singular, e.g. “~/.superapp/cache”.

  • [Windows] Add roaming option to user_data_dir() (for use on Windows only) and change the default user_data_dir behaviour to use a non-roaming profile dir (CSIDL_LOCAL_APPDATA instead of CSIDL_APPDATA). Why? Because a large roaming profile can cause login speed issues. The “only syncs on logout” behaviour can cause surprises in appdata info.

appdirs 1.0.1 (never released)

Started this changelog 27 July 2010. Before that this module originated in the Komodo product as and then as applib/ (used by PyPM in ActivePython). This is basically a fork of 1.0.1 and applib/ 1.0.1.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release. See tutorial on generating distribution archives.

Built Distribution

xdgappdirs-1.4.5-py2.py3-none-any.whl (15.4 kB view hashes)

Uploaded py2 py3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page