在 *nix 命令行实用程序中保存首选项文件的位置/方法



我正在编写一个小的命令行实用程序。它应该能够在OSX,UNIX和Linux上运行。

它需要在某处保存一些首选项,例如在小型 YAML 配置文件中。在哪里保存这样的文件?

语言: 蟒蛇 2.7
操作系统: *尼克斯

通常,这些文件位于~/.rc(例如:~/.hgrc)之类的地方。这可能是文件的路径,如果需要大量配置设置,也可以是目录的路径。

有关不错的描述,请参阅 http://www.linuxtopia.org/online_books/programming_books/art_of_unix_programming/ch10s03.html

我会避免将文件放在~目录中,只是因为它已经完全充斥着废话。最近的趋势,至少在 ubuntu 上,是将 ~/.config/<appname>/ 用于您需要的任何点文件。我真的很喜欢这个惯例。

如果您的应用程序名为"someapp",则将配置保存在 $HOME/.someapp 等文件中。 如果您愿意,可以给配置文件一个扩展名。 如果您认为您的应用可能有多个配置文件,则可以使用目录$HOME/.someapp并在其中创建常规命名(非隐藏)文件。

许多跨平台工具在OS X上使用与Linux(以及其他POSIX/非Windows平台)相同的路径。使用 POSIX 位置的主要优点不是节省几行代码,而是节省对 Mac 特定指令的需求,并允许 Mac 用户从社区中的 Linux 用户那里获得帮助(无需翻译他们的建议)。

另一种选择是将它们放在~/Library下的"Mac友好"位置。使用Mac位置的主要优点基本上是"Apple是这样说的"-除非您计划对代码进行沙盒处理,在这种情况下,主要优点是您可以这样做。

如果您选择使用库位置,则应阅读文件系统编程指南中的关于 OS X 文件系统和 OS X 资源库目录详细信息,但以下是简短版本:

  • 几乎所有内容:在~/Library/Application Support下创建一个包含应用名称或捆绑ID的子目录(除非您特意设置捆绑ID,否则您将获得org.python.python,这是您不想要的...)。理想情况下,您应该使用 -[NSFileManager URLForDirectory:inDomain:appropriateForURL:create:error:] 这样的 API 来获取路径;如果没有,您必须手动处理本地化、沙盒容器等。
  • 任何可以轻松重新创建的内容(因此不需要备份、迁移等):名称相同的 ~/Library/Caches 子目录。
  • 首选项:请改用 NSUserDefaults 或 CFPreference API。如果您使用自己的格式,那么"旧"的做事方式是在 ~/Library/Preferences 下创建一个以您的应用程序名称或捆绑 ID 命名的子目录,并将您的文件放入其中。苹果不再推荐这样做,但并不真正推荐替代方案(除了"使用 CFPreferences,该死的!");许多应用程序(例如,Aquamacs)仍然以旧的方式进行,但其他应用程序则假装它们不是首选项并将它们存储在应用程序支持下。

在 Python 中,这的工作方式如下(省略错误处理,并假设您按名称而不是为自己设置捆绑 ID):

from Foundation import *
fm = NSFileManager.defaultManager()
appsupport = (fm.URLForDirectory_inDomain_appropriateForURL_create_error_(
  NSApplicationSupportDirectory, NSUserDomainMask, None, True, None)[0].
  URLByAppendingPathComponent_isDirectory_(
  appname, True))
caches = (fm.URLForDirectory_inDomain_appropriateForURL_create_error_(
  NSCachesDirectory, NSUserDomainMask, None, True, None)[0].
  URLByAppendingPathComponent_isDirectory_(
  appname, True))
prefs = NSUserDefaults.persistentDomainForName_(appname)

最新更新