一个用于确定适当平台特定目录的小型Python包,例如用户数据目录。
项目描述
问题
在编写桌面应用程序时,根据平台不同,用户数据和配置存储的正确位置会有所不同。即使是针对单一平台的程序,在确定正确的位置时也可能存在很多细微差别。
例如,如果在macOS上运行,应使用
~/Library/Application Support/<AppName>
如果在Windows(至少是英文版Win)上,应该是
C:\Documents and Settings\<User>\Application Data\Local Settings\<AppAuthor>\<AppName>
或者可能是
C:\Documents and Settings\<User>\Application Data\<AppAuthor>\<AppName>
针对漫游配置文件(但这又是另一个话题了)。
在Linux(以及其他类Unix系统)上,根据XDG Basedir规范,应该是
~/.local/share/<AppName>
platformdirs来救驾
这类事情正是platformdirs包的作用所在。platformdirs将帮助您选择合适的
用户数据目录(user_data_dir)
用户配置目录(user_config_dir)
用户缓存目录(user_cache_dir)
站点数据目录(site_data_dir)
站点配置目录(site_config_dir)
用户日志目录(user_log_dir)
用户文档目录(user_documents_dir)
用户下载目录(user_downloads_dir)
用户图片目录(user_pictures_dir)
用户视频目录(user_videos_dir)
用户音乐目录(user_music_dir)
用户桌面目录(user_desktop_dir)
用户运行时目录(user_runtime_dir)
还有
对目录名称的使用略有偏见。在文档和代码中寻找“OPINION”来了解何时应用了偏见。
示例输出
在macOS上
>>> from platformdirs 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)
'/Users/trentm/Library/Caches/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'
在Windows上
>>> 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_cache_dir(appname, appauthor)
'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Cache'
>>> 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'
在Linux上
>>> from platformdirs import *
>>> appname = "SuperApp"
>>> appauthor = "Acme"
>>> user_data_dir(appname, appauthor)
'/home/trentm/.local/share/SuperApp'
>>> site_data_dir(appname, appauthor)
'/usr/local/share/SuperApp'
>>> site_data_dir(appname, appauthor, multipath=True)
'/usr/local/share/SuperApp:/usr/share/SuperApp'
>>> user_cache_dir(appname, appauthor)
'/home/trentm/.cache/SuperApp'
>>> user_log_dir(appname, appauthor)
'/home/trentm/.local/state/SuperApp/log'
>>> user_config_dir(appname)
'/home/trentm/.config/SuperApp'
>>> 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'
>>> 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'
在Android上
>>> from platformdirs import * >>> appname = "SuperApp" >>> appauthor = "Acme" >>> user_data_dir(appname, appauthor) '/data/data/com.myApp/files/SuperApp' >>> user_cache_dir(appname, appauthor) '/data/data/com.myApp/cache/SuperApp' >>> user_log_dir(appname, appauthor) '/data/data/com.myApp/cache/SuperApp/log' >>> user_config_dir(appname) '/data/data/com.myApp/shared_prefs/SuperApp' >>> 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'
注意:一些Android应用程序(如Termux和Pydroid)被用作shell。这些应用程序被最终用户用于模拟Linux环境。Platformdirs使用SHELL环境变量来区分普通Android应用程序和用作shell的Android应用程序。Shell Android应用程序也支持XDG_*环境变量。
为方便起见,使用PlatformDirs
>>> from platformdirs import PlatformDirs
>>> dirs = PlatformDirs("SuperApp", "Acme")
>>> dirs.user_data_dir
'/Users/trentm/Library/Application Support/SuperApp'
>>> dirs.site_data_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'
版本隔离
如果您正在使用应用程序的多个版本,并且想要能够并行运行这些版本,那么您可能需要对这些目录进行版本隔离
>>> from platformdirs import PlatformDirs >>> dirs = PlatformDirs("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 '/Users/trentm/Library/Caches/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'
但请注意,不要为此使用配置文件;您需要手动处理配置文件的迁移。
为什么创建这个分支?
此存储库是对ActiveState开始并创建此包的祖先包appdirs的友好分支。
维护一个开源项目并非易事,尤其是在组织内部,Python 社区对 appdirs(尤其是 Trent Mick 和 Jeff Rouse)所创建的这个非常有用的简单模块表示感激,因为它吸引了大量用户。
尽管如此,鉴于长期存在的问题和拉取请求的数量,以及没有明确的路径来确保包的维护会继续或增长,因此创建了这个分支。
我们非常欢迎贡献。
项目详情
下载文件
下载适合您平台的文件。如果您不确定该选择哪一个,请了解更多关于安装包的信息。