https://github.com/tox-dev/platformdirs

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

https://github.com/tox-dev/platformdirs

Science Score: 36.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
  • Academic publication links
  • Committers with academic emails
    2 of 76 committers (2.6%) from academic institutions
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (9.4%) to scientific vocabulary

Keywords

appdirs configuration cross-platform hacktoberfest xdg xdg-user-dirs

Keywords from Contributors

packaging pip pypi requests virtualenv humans unit-testing python-requests forhumans cookies
Last synced: 6 months ago · JSON representation

Repository

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

Basic Info
Statistics
  • Stars: 811
  • Watchers: 12
  • Forks: 63
  • Open Issues: 20
  • Releases: 48
Topics
appdirs configuration cross-platform hacktoberfest xdg xdg-user-dirs
Created almost 5 years ago · Last pushed 6 months ago
Metadata Files
Readme Changelog Contributing Funding License Codeowners Security

README.rst

The problem
===========

.. image:: https://badge.fury.io/py/platformdirs.svg
   :target: https://badge.fury.io/py/platformdirs
.. image:: https://img.shields.io/pypi/pyversions/platformdirs.svg
   :target: https://pypi.python.org/pypi/platformdirs/
.. image:: https://github.com/tox-dev/platformdirs/actions/workflows/check.yaml/badge.svg
   :target: https://github.com/platformdirs/platformdirs/actions
.. image:: https://static.pepy.tech/badge/platformdirs/month
   :target: https://pepy.tech/project/platformdirs

When writing desktop application, finding the right location to store user data
and configuration varies per platform. Even for single-platform apps, there
may by plenty of nuances in figuring out the right location.

For example, if running on macOS, you should use::

    ~/Library/Application Support/

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

    C:\Documents and Settings\\Application Data\Local Settings\\

or possibly::

    C:\Documents and Settings\\Application Data\\

for `roaming profiles `_ but that is another story.

On Linux (and other Unices), according to the `XDG Basedir Spec`_, it should be::

    ~/.local/share/

.. _XDG Basedir Spec: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html

``platformdirs`` to the rescue
==============================

This kind of thing is what the ``platformdirs`` package is for.
``platformdirs`` 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``)
- user documents dir (``user_documents_dir``)
- user downloads dir (``user_downloads_dir``)
- user pictures dir (``user_pictures_dir``)
- user videos dir (``user_videos_dir``)
- user music dir (``user_music_dir``)
- user desktop dir (``user_desktop_dir``)
- user runtime dir (``user_runtime_dir``)

And also:

- Is slightly opinionated on the directory names used. Look for "OPINION" in
  documentation and code for when an opinion is being applied.

Example output
==============

On macOS:

.. code-block:: pycon

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    '/Users/trentm/Library/Application Support/SuperApp'
    >>> user_config_dir(appname, appauthor)
    '/Users/trentm/Library/Application Support/SuperApp'
    >>> user_cache_dir(appname, appauthor)
    '/Users/trentm/Library/Caches/SuperApp'
    >>> site_data_dir(appname, appauthor)
    '/Library/Application Support/SuperApp'
    >>> site_config_dir(appname, appauthor)
    '/Library/Application Support/SuperApp'
    >>> user_log_dir(appname, appauthor)
    '/Users/trentm/Library/Logs/SuperApp'
    >>> user_documents_dir()
    '/Users/trentm/Documents'
    >>> user_downloads_dir()
    '/Users/trentm/Downloads'
    >>> user_pictures_dir()
    '/Users/trentm/Pictures'
    >>> user_videos_dir()
    '/Users/trentm/Movies'
    >>> user_music_dir()
    '/Users/trentm/Music'
    >>> user_desktop_dir()
    '/Users/trentm/Desktop'
    >>> user_runtime_dir(appname, appauthor)
    '/Users/trentm/Library/Caches/TemporaryItems/SuperApp'

On Windows:

.. code-block:: pycon

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp'
    >>> user_data_dir(appname, appauthor, roaming=True)
    'C:\\Users\\trentm\\AppData\\Roaming\\Acme\\SuperApp'
    >>> user_config_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp'
    >>> user_cache_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Cache'
    >>> site_data_dir(appname, appauthor)
    'C:\\ProgramData\\Acme\\SuperApp'
    >>> site_config_dir(appname, appauthor)
    'C:\\ProgramData\\Acme\\SuperApp'
    >>> user_log_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Logs'
    >>> user_documents_dir()
    'C:\\Users\\trentm\\Documents'
    >>> user_downloads_dir()
    'C:\\Users\\trentm\\Downloads'
    >>> user_pictures_dir()
    'C:\\Users\\trentm\\Pictures'
    >>> user_videos_dir()
    'C:\\Users\\trentm\\Videos'
    >>> user_music_dir()
    'C:\\Users\\trentm\\Music'
    >>> user_desktop_dir()
    'C:\\Users\\trentm\\Desktop'
    >>> user_runtime_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Temp\\Acme\\SuperApp'

On Linux:

.. code-block:: pycon

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    '/home/trentm/.local/share/SuperApp'
    >>> user_config_dir(appname)
    '/home/trentm/.config/SuperApp'
    >>> user_cache_dir(appname, appauthor)
    '/home/trentm/.cache/SuperApp'
    >>> site_data_dir(appname, appauthor)
    '/usr/local/share/SuperApp'
    >>> site_data_dir(appname, appauthor, multipath=True)
    '/usr/local/share/SuperApp:/usr/share/SuperApp'
    >>> site_config_dir(appname)
    '/etc/xdg/SuperApp'
    >>> os.environ["XDG_CONFIG_DIRS"] = "/etc:/usr/local/etc"
    >>> site_config_dir(appname, multipath=True)
    '/etc/SuperApp:/usr/local/etc/SuperApp'
    >>> user_log_dir(appname, appauthor)
    '/home/trentm/.local/state/SuperApp/log'
    >>> user_documents_dir()
    '/home/trentm/Documents'
    >>> user_downloads_dir()
    '/home/trentm/Downloads'
    >>> user_pictures_dir()
    '/home/trentm/Pictures'
    >>> user_videos_dir()
    '/home/trentm/Videos'
    >>> user_music_dir()
    '/home/trentm/Music'
    >>> user_desktop_dir()
    '/home/trentm/Desktop'
    >>> user_runtime_dir(appname, appauthor)
    '/run/user/{os.getuid()}/SuperApp'

On Android::

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    '/data/data/com.myApp/files/SuperApp'
    >>> user_config_dir(appname)
    '/data/data/com.myApp/shared_prefs/SuperApp'
    >>> user_cache_dir(appname, appauthor)
    '/data/data/com.myApp/cache/SuperApp'
    >>> site_data_dir(appname, appauthor)
    '/data/data/com.myApp/files/SuperApp'
    >>> site_config_dir(appname)
    '/data/data/com.myApp/shared_prefs/SuperApp'
    >>> user_log_dir(appname, appauthor)
    '/data/data/com.myApp/cache/SuperApp/log'
    >>> user_documents_dir()
    '/storage/emulated/0/Documents'
    >>> user_downloads_dir()
    '/storage/emulated/0/Downloads'
    >>> user_pictures_dir()
    '/storage/emulated/0/Pictures'
    >>> user_videos_dir()
    '/storage/emulated/0/DCIM/Camera'
    >>> user_music_dir()
    '/storage/emulated/0/Music'
    >>> user_desktop_dir()
    '/storage/emulated/0/Desktop'
    >>> user_runtime_dir(appname, appauthor)
    '/data/data/com.myApp/cache/SuperApp/tmp'

Note: Some android apps like Termux and Pydroid are used as shells. These
apps are used by the end user to emulate Linux environment. Presence of
``SHELL`` environment variable is used by Platformdirs to differentiate
between general android apps and android apps used as shells. Shell android
apps also support ``XDG_*`` environment variables.


``PlatformDirs`` for convenience
================================

.. code-block:: pycon

    >>> from platformdirs import PlatformDirs
    >>> dirs = PlatformDirs("SuperApp", "Acme")
    >>> dirs.user_data_dir
    '/Users/trentm/Library/Application Support/SuperApp'
    >>> dirs.user_config_dir
    '/Users/trentm/Library/Application Support/SuperApp'
    >>> dirs.user_cache_dir
    '/Users/trentm/Library/Caches/SuperApp'
    >>> dirs.site_data_dir
    '/Library/Application Support/SuperApp'
    >>> dirs.site_config_dir
    '/Library/Application Support/SuperApp'
    >>> dirs.user_cache_dir
    '/Users/trentm/Library/Caches/SuperApp'
    >>> dirs.user_log_dir
    '/Users/trentm/Library/Logs/SuperApp'
    >>> dirs.user_documents_dir
    '/Users/trentm/Documents'
    >>> dirs.user_downloads_dir
    '/Users/trentm/Downloads'
    >>> dirs.user_pictures_dir
    '/Users/trentm/Pictures'
    >>> dirs.user_videos_dir
    '/Users/trentm/Movies'
    >>> dirs.user_music_dir
    '/Users/trentm/Music'
    >>> dirs.user_desktop_dir
    '/Users/trentm/Desktop'
    >>> dirs.user_runtime_dir
    '/Users/trentm/Library/Caches/TemporaryItems/SuperApp'

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 platformdirs import PlatformDirs
    >>> dirs = PlatformDirs("SuperApp", "Acme", version="1.0")
    >>> dirs.user_data_dir
    '/Users/trentm/Library/Application Support/SuperApp/1.0'
    >>> dirs.user_config_dir
    '/Users/trentm/Library/Application Support/SuperApp/1.0'
    >>> dirs.user_cache_dir
    '/Users/trentm/Library/Caches/SuperApp/1.0'
    >>> dirs.site_data_dir
    '/Library/Application Support/SuperApp/1.0'
    >>> dirs.site_config_dir
    '/Library/Application Support/SuperApp/1.0'
    >>> dirs.user_log_dir
    '/Users/trentm/Library/Logs/SuperApp/1.0'
    >>> dirs.user_documents_dir
    '/Users/trentm/Documents'
    >>> dirs.user_downloads_dir
    '/Users/trentm/Downloads'
    >>> dirs.user_pictures_dir
    '/Users/trentm/Pictures'
    >>> dirs.user_videos_dir
    '/Users/trentm/Movies'
    >>> dirs.user_music_dir
    '/Users/trentm/Music'
    >>> dirs.user_desktop_dir
    '/Users/trentm/Desktop'
    >>> dirs.user_runtime_dir
    '/Users/trentm/Library/Caches/TemporaryItems/SuperApp/1.0'

Be wary of using this for configuration files though; you'll need to handle
migrating configuration files manually.

Why this Fork?
==============

This repository is a friendly fork of the wonderful work started by
`ActiveState `_ who created
``appdirs``, this package's ancestor.

Maintaining an open source project is no easy task, particularly
from within an organization, and the Python community is indebted
to ``appdirs`` (and to Trent Mick and Jeff Rouse in particular) for
creating an incredibly useful simple module, as evidenced by the wide
number of users it has attracted over the years.

Nonetheless, given the number of long-standing open issues
and pull requests, and no clear path towards `ensuring
that maintenance of the package would continue or grow
`_, this fork was
created.

Contributions are most welcome.

Owner

  • Name: tox development team
  • Login: tox-dev
  • Kind: organization
  • Email: gaborjbernat@gmail.com
  • Location: United Kingdom

testing out of the box

GitHub Events

Total
  • Create event: 34
  • Release event: 1
  • Issues event: 12
  • Watch event: 180
  • Delete event: 31
  • Issue comment event: 38
  • Push event: 53
  • Pull request review comment event: 26
  • Pull request review event: 74
  • Pull request event: 80
  • Fork event: 12
Last Year
  • Create event: 34
  • Release event: 1
  • Issues event: 12
  • Watch event: 180
  • Delete event: 31
  • Issue comment event: 38
  • Push event: 53
  • Pull request review comment event: 26
  • Pull request review event: 74
  • Pull request event: 80
  • Fork event: 12

Committers

Last synced: 7 months ago

All Time
  • Total Commits: 451
  • Total Committers: 76
  • Avg Commits per committer: 5.934
  • Development Distribution Score (DDS): 0.805
Past Year
  • Commits: 58
  • Committers: 10
  • Avg Commits per committer: 5.8
  • Development Distribution Score (DDS): 0.431
Top Committers
Name Email Commits
pre-commit-ci[bot] 6****] 88
Bernát Gábor g****t@g****m 69
dependabot[bot] 4****] 33
Trent Mick t****m@g****m 28
Julian Berman J****n@G****m 21
Jeff Rouse jr@i****o 19
Eddy Petrișor e****r@g****m 17
Sridhar Ratnakumar s****a@g****m 13
Sridhar Ratnakumar g****b@s****e 12
Sridhar Ratnakumar s****r@a****m 12
Jon Dufresne j****e@g****m 12
Ofek Lev o****r@g****m 8
Hugo van Kemenade h****k 8
Benjamin Drung b****g@p****m 7
Kemal Zebari 6****b 7
cpburnz c****z@g****m 7
jack1142 6****2 5
Ruslan Kuprieiev k****r@g****m 4
Thomas Grainger t****n@g****m 4
Matěj Cepl m****l@r****m 3
Sridhar Ratnakumar me@s****e 3
carlgeorge c****e@r****m 3
Joe Esposito j****e@j****m 3
Edgar Ramírez Mondragón 1****n 3
Mathieu Dupuy d****x@g****m 2
wzy 3****u 2
Sergey Fedoseev f****y@g****m 2
Pradyun Gedam p****g@g****m 2
Pablo Prietz p****o@p****g 2
Mark Keller 8****0 2
and 46 more...

Issues and Pull Requests

Last synced: 6 months ago

All Time
  • Total issues: 52
  • Total pull requests: 228
  • Average time to close issues: 7 days
  • Average time to close pull requests: 4 days
  • Total issue authors: 46
  • Total pull request authors: 44
  • Average comments per issue: 3.37
  • Average comments per pull request: 0.68
  • Merged pull requests: 196
  • Bot issues: 1
  • Bot pull requests: 141
Past Year
  • Issues: 13
  • Pull requests: 115
  • Average time to close issues: 4 days
  • Average time to close pull requests: 3 days
  • Issue authors: 13
  • Pull request authors: 14
  • Average comments per issue: 1.31
  • Average comments per pull request: 0.17
  • Merged pull requests: 98
  • Bot issues: 1
  • Bot pull requests: 87
Top Authors
Issue Authors
  • Jackenmen (2)
  • julie777 (2)
  • domdfcoding (2)
  • reneeotten (2)
  • PhrozenByte (2)
  • Pro-pra (2)
  • The-Compiler (1)
  • vlanse (1)
  • uilianries (1)
  • tiran (1)
  • AWhetter (1)
  • havocesp (1)
  • nukemiko (1)
  • pradyunsg (1)
  • Jayman2000 (1)
Pull Request Authors
  • pre-commit-ci[bot] (100)
  • dependabot[bot] (41)
  • gaborbernat (27)
  • ofek (5)
  • hugovk (3)
  • edgarrmondragon (3)
  • Jackenmen (3)
  • WhyNotHugo (3)
  • domdfcoding (2)
  • papr (2)
  • Jayman2000 (2)
  • cbm755 (2)
  • Blocked (2)
  • deronnax (2)
  • gene1wood (2)
Top Labels
Issue Labels
help wanted (6) enhancement (5) bug (2) question (1)
Pull Request Labels
dependencies (41) github_actions (6) enhancement (1)

Dependencies

.github/workflows/check.yml actions
  • actions/checkout v3 composite
  • actions/download-artifact v3 composite
  • actions/setup-python v4 composite
  • actions/upload-artifact v3 composite
  • pypa/gh-action-pypi-publish v1.6.4 composite
pyproject.toml pypi
  • typing-extensions >=4.4; python_version < "3.8"