2

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

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

语言:Python 2.7
操作系统:*nix

4

4 回答 4

4

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

有关详细说明,请参见http://www.linuxtopia.org/online_books/programming_books/art_of_unix_programming/ch10s03.html

于 2012-06-29T22:44:20.223 回答
3

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

于 2012-06-29T22:44:45.263 回答
3

我会避免将文件放在~目录中,因为它完全被垃圾淹没了。至少在 ubuntu 上,最近的趋势是~/.config/<appname>/用于您需要的任何点文件。我真的很喜欢那个约定。

于 2012-06-29T22:45:32.700 回答
1

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

另一种选择是将它们放在 ~/Library 下的“Mac-friendly”位置。使用 Mac 位置的主要优势基本上是“Apple 这么说”——除非您打算对代码进行沙箱化,在这种情况下,主要优势是您可以这样做。

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

  • 几乎所有内容:在 ~/库/应用程序支持。理想情况下,您应该使用 -[NSFileManager URLForDirectory:inDomain:appropriateForURL:create:error:] 之类的 API 来获取路径;如果没有,您必须手动处理本地化、沙盒容器等问题。
  • 可以轻松重新创建的任何内容(因此不需要备份、迁移等): ~/Library/Caches 的同名子目录。
  • 首选项:改用 NSUserDefaults 或 CFPreferences API。如果您使用自己的格式,“旧”的做事方式是在 ~/Library/Preferences 下创建一个以您的应用程序名称或捆绑 ID 命名的子目录,并将您的文件放入其中。Apple 不再推荐,但并没有真正推荐替代方案(缺少“使用 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)
于 2012-07-02T18:21:01.833 回答