跨平台配置文件寻址
简单的情况
我有一个Python程序,想让它在*nix和Windows系统上都能运行。这个程序必须可以配置,至少要有全局配置。有没有什么跨平台的方法来处理配置文件呢?
也就是说,我想写的不是
import platform
if platform.system() == "Windows":
configFilePath = "C:\MyProgram\mainconfig.ini"
else:
configFilePath = "/etc/myprogram/mainconfig.ini"
而是类似下面这样的
import configmagic
configFile = configmagic("myprogram", "mainconfig")
稍微复杂一点的情况
同样的方式可以用在用户特定的配置上吗?也就是说,能不能把配置放在Unix系统的~user/.myprogram/
目录下,而在Windows系统的HKEY_LOCAL_USER
注册表部分呢?
3 个回答
现在的回答没有完全解决你的问题(跨平台 + 用户配置和系统配置的区别)。
confuse库可以满足你的需求:
这个库可以把来自多个地方的配置数据结合在一起。通过分层的方式,Confuse 允许用户的配置轻松覆盖系统的配置,而系统的配置又可以覆盖内置的默认设置。
[...]
在包内的 config_default.yaml 文件可以用来提供最底层的默认设置,使用的语法和用户看到的一样。运行时的覆盖层允许程序动态地覆盖和添加配置值。你可以在特定平台的路径中查找配置文件,比如在 Unix 系统中是 $XDG_CONFIG_HOME 或 ~/.config;在 macOS 中是“Application Support”;在 Windows 中是 %APPDATA%。
你可能想用 dirspec
。它可以在GNU/Linux、Mac OS和Windows上使用。
你可以从这里获取它: Launchpad
或者从 PyPI 安装它。
pip install dirspec
在你的代码中可以使用类似这样的内容:
from dirspec.basedir import get_xdg_config_home
config_path = get_xdg_config_home()
它被Ubuntu One使用,看看他们文档中的这个代码示例: https://one.ubuntu.com/developer/data/u1db/tutorial#storing-and-retrieving-tasks
在Windows系统上,Python可以使用正斜杠(/)来表示文件路径。而且,os.path.expanduser
这个功能在Windows上也能正常工作,所以你可以通过以下方式获取特定用户的文件路径:
config_file = os.path.expanduser("~/foo.ini")
如果你想在用户的主目录中找到一个.ini文件。我不太确定怎么把基于文件的.ini设置和注册表设置统一起来。