https://github.com/tox-dev/platformdirs
A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
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
- Host: GitHub
- Owner: tox-dev
- License: mit
- Language: Python
- Default Branch: main
- Homepage: https://platformdirs.readthedocs.io
- Size: 504 KB
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
- Website: https://tox.wiki
- Twitter: gjbernat
- Repositories: 31
- Profile: https://github.com/tox-dev
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
Top Committers
| Name | 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... | ||
Committer Domains (Top 20 + Academic)
srid.name: 2
redhat.com: 2
grayvines.com: 1
its.to: 1
activestate.com: 1
profitbricks.com: 1
rackspace.com: 1
joeyespo.com: 1
prietz.org: 1
jwilk.net: 1
davis-foster.co.uk: 1
barrera.io: 1
mit.edu: 1
jeremystepp.me: 1
waldmann-edv.de: 1
eightysoft.de: 1
inria.fr: 1
narnian.us: 1
polyconseil.fr: 1
davidbaumgold.com: 1
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"