Как я могу получить пользовательские каталоги по умолчанию (XDG) из Python?

Например, на английском языке пользовательские папки по умолчанию будут:

$HOME/Desktop
....
$HOME/Videos

На испанском языке пользовательские папки по умолчанию будут:

$HOME/Escritorio
....
$HOME/Vídeos

Файл ~/.config/user-dirs.dirs имеет эти локализованные имена для папок по умолчанию. (Всегда?).

Мне нужно получить эти имена из скрипта Python. Я бы не хотел анализировать этот файл. Есть ли другой элегантный способ? Я нашел это:

from xdg.BaseDirectory import *
print xdg_cache_home
print xdg_config_dirs
print xdg_config_home
print xdg_data_dirs
print xdg_data_home

Но он не возвращает эти папки.

Заранее спасибо!

5 ответов

Решение

Если вы не против получить зависимость от GLib или если вы уже используете GTK в качестве инструментария, вы можете использовать GLib.get_user_special_dir() метод.

>>> from gi.repository import GLib
>>> GLib.get_user_special_dir(GLib.USER_DIRECTORY_PICTURES)
'/home/timo/Afbeeldingen'
>>> GLib.get_user_special_dir(GLib.USER_DIRECTORY_DOCUMENTS)
'/home/timo/Documenten'
>>> GLib.get_user_special_dir(GLib.USER_DIRECTORY_DOWNLOAD)
'/home/timo/Downloads'

Все доступные каталоги:

G_USER_DIRECTORY_DESKTOP         the user's Desktop directory
G_USER_DIRECTORY_DOCUMENTS       the user's Documents directory
G_USER_DIRECTORY_DOWNLOAD        the user's Downloads directory
G_USER_DIRECTORY_MUSIC           the user's Music directory
G_USER_DIRECTORY_PICTURES        the user's Pictures directory
G_USER_DIRECTORY_PUBLIC_SHARE    the user's shared directory
G_USER_DIRECTORY_TEMPLATES       the user's Templates directory
G_USER_DIRECTORY_VIDEOS          the user's Movies directory
G_USER_N_DIRECTORIES             the number of enum values

Если вы получили это сообщение об ошибке:

ImportError: При использовании gi.repository вы не должны импортировать статические модули, такие как "gobject". Пожалуйста, измените все вхождения "import gobject" на "из gi.repository import GObject".

Вам нужно использовать это:

import glib
return glib.get_user_special_dir(glib.USER_DIRECTORY_PICTURES)

Установите библиотеку python для доступа к стандартам freedesktop.org

Чтобы получить каталоги XDG из Python, вам нужно установить (в зависимости от вашей версии Python) один из следующих пакетов:

Для Python 2.x

sudo apt-get install python-xdg

Для Python 3:

sudo apt-get install python3-xdg 

XDG каталоги

  • $XDG_DATA_HOME определяет базовый каталог, относительно которого должны храниться файлы данных пользователя. Если $XDG_DATA_HOME либо не задано, либо пусто, значение по умолчанию равно $HOME/.local/share должен быть использован.

  • $XDG_CONFIG_HOME определяет базовый каталог, относительно которого должны храниться файлы конфигурации пользователя. Если $XDG_CONFIG_HOME либо не задано, либо пусто, значение по умолчанию равно $HOME/.config должен быть использован.

  • $XDG_DATA_DIRS определяет упорядоченный по предпочтениям набор базовых каталогов для поиска файлов данных в дополнение к $XDG_DATA_HOME базовый каталог. Каталоги в $XDG_DATA_DIRS должен быть разделен двоеточием ':'.

    Если $XDG_DATA_DIRS либо не установлен, либо пуст, значение равно /usr/local/share/:/usr/share/ должен быть использован.

  • $XDG_CONFIG_DIRS определяет упорядоченный по предпочтениям набор базовых каталогов для поиска файлов конфигурации в дополнение к $XDG_CONFIG_HOME базовый каталог. Каталоги в $XDG_CONFIG_DIRS должен быть отделен двоеточием ':'.

    Если $XDG_CONFIG_DIRS либо не установлен, либо пуст, значение равно /etc/xdg должен быть использован.

Источник: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html

ОБНОВЛЕНИЕ: Как получить доступ к пользовательским каталогам XDG для Ubuntu:

~/.config/user-dirs.dirs Файл всегда будет содержать локализованные имена, так как инструмент xdg-user-dirs-update управляет этим файлом, см. раздел специальной справочной страницы:

   The XDG user dirs configuration is stored in the user-dirs.dir
   file in the location pointed to by the XDG_CONFIG_HOME
   environment variable.

Следующий код Python позволит вам разобрать ~/.config/user-dirs.dirs,

#!/usr/bin/env python

import io
import os
import re
import ConfigParser

from xdg.BaseDirectory import xdg_config_home

config = ConfigParser.RawConfigParser(allow_no_value=True)

f = open(os.path.join(xdg_config_home, "user-dirs.dirs"))
user_config = "[XDG_USER_DIR]\n" + f.read()
f.close()
user_config = re.sub('\$HOME', os.path.expanduser("~"), user_config)
user_config = re.sub('"', '', user_config)

config.readfp(io.BytesIO(user_config))
print config.get("XDG_USER_DIR", "XDG_PICTURES_DIR")

Я все еще вижу эту проблему в Ubuntu 22.04 в декабре 2022 года.

Я понял, что

      /usr/lib/python3.10 and ~/.local/lib/python3.10 

у вас нет dist-пакетов или xdg. Но/usr/lib/python3/dist-packages/имеет xdg, который имеетBaseDirectory.pyи другие.

В итоге у меня сработало копирование файла на мой домашний путь:

      cp /usr/lib/python3/dist-packages/xdg/BaseDirectory.py ~/.local/lib/python3.10/site-packages/xdg/
      import os
XDG_DATA_DIRS = os.environ.get("XDG_DATA_DIRS")

Повторите для других каталогов XDG.

Если вы не хотите устанавливать какие-либо зависимости, вы можете следовать спецификации, чтобы написать свой собственный код, или скопировать код, найденный вBaseDirectory.py. Код довольно прост:

      import os

_home = os.path.expanduser('~')

xdg_data_home = os.environ.get('XDG_DATA_HOME') or \
            os.path.join(_home, '.local', 'share')

xdg_config_home = os.environ.get('XDG_CONFIG_HOME') or \
            os.path.join(_home, '.config')
Другие вопросы по тегам