Исходный код EJIO.utils.system.paths
## /utils/system/paths.py
from pathlib import Path
from ..interface import ReadOnlyMeta
__all__ = [
'SystemPaths',
'get_app_root',
]
[документация]
def get_app_root() -> Path:
"""
Возвращает абсолютный путь к корневой папке, где запущен главный файл приложения.
Надежно работает как при обычном запуске скрипта, так и при сборке через PyInstaller.
:return: Путь к корню программы.
"""
import sys
if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
return Path(sys._MEIPASS) # type: ignore[attr-defined]
# Извлекаем путь к самому первому запущенному файлу (__main__)
main_module = sys.modules.get('__main__')
if main_module and hasattr(main_module, '__file__') and main_module.__file__:
return Path(main_module.__file__).resolve().parent
return Path.cwd().resolve()
[документация]
class SystemPaths(metaclass=ReadOnlyMeta):
"""
Неизменяемая структура системных путей только для чтения.
Корректно работает на Windows, Linux и macOS.
"""
__slots__ = ()
@staticmethod
def user_home() -> Path:
"""Путь к домашней директории текущего пользователя."""
return Path.home().resolve()
@staticmethod
def desktop() -> Path:
"""Путь к рабочему столу пользователя."""
return Path.home().joinpath("Desktop").resolve()
@staticmethod
def documents() -> Path:
"""Путь к папке Документы."""
return Path.home().joinpath("Documents").resolve()
@staticmethod
def app_data() -> Path:
"""
Путь к изолированной папке для хранения локальных конфигураций и данных приложений.
Windows: %APPDATA%
Linux: ~/.config
macOS: ~/Library/Application Support
"""
import os
from .properties import SystemProperties
system = SystemProperties.os
if system == "windows":
return Path(os.environ.get("APPDATA", Path.home().joinpath("AppData", "Roaming"))).resolve()
if system == "darwin":
return Path.home().joinpath("Library", "Application Support").resolve()
return Path.home().joinpath(".config").resolve()
@staticmethod
def app_cache() -> Path:
"""
Путь к папке для хранения временных файлов кэша приложений.
Windows: %LOCALAPPDATA%/Cache
Linux: ~/.cache
macOS: ~/Library/Caches
"""
import os
from .properties import SystemProperties
system = SystemProperties.os
if system == "windows":
local = os.environ.get("LOCALAPPDATA", Path.home().joinpath("AppData", "Local"))
return Path(local).joinpath("Cache").resolve()
if system == "darwin":
return Path.home().joinpath("Library", "Caches").resolve()
return Path.home().joinpath(".cache").resolve()
@staticmethod
def temp() -> Path:
"""Путь к глобальной системной папке временных файлов."""
import tempfile
return Path(tempfile.gettempdir()).resolve()
[документация]
@classmethod
def clear(cls) -> None:
"""Реализация контракта Disposable.."""
pass
[документация]
@classmethod
def destroy(cls) -> None:
"""Реализация контракта Disposable."""
pass