Simple case
I have a Python program that I intend to support on both *nix and Windows systems. The program must be configurable, at least globally. Is there a cross-platform way to address the configuration file?
I.e. I want to write instead of
import platform
if platform.system() == "Windows":
configFilePath = "C:\MyProgram\mainconfig.ini"
else:
configFilePath = "/etc/myprogram/mainconfig.ini"
something along the lines of
import configmagic
configFile = configmagic("myprogram", "mainconfig")
A slightly more advanced case
Can the same be applied to user-specific configuration? I.e. to keep the configuration in ~user/.myprogram/
under Unix, and in HKEY_LOCAL_USER
registry section under Windows?
Python will allow forward-slash paths on Windows, and os.path.expanduser
works on Windows also, so you can get a user-specific file path using:
config_file = os.path.expanduser("~/foo.ini")
if you want to find a .ini in the user's home directory. I'm not sure how to unify file-based .ini and registry settings.
You may want to use dirspec
. It works in GNU/Linux, Mac OS and Windows.
You can get it from: Launchpad
Or installing it from PyPI
pip install dirspec
and in your code use something like:
from dirspec.basedir import get_xdg_config_home
config_path = get_xdg_config_home()
It's used by Ubuntu One, look at this code example from their documentation: https://one.ubuntu.com/developer/data/u1db/tutorial#storing-and-retrieving-tasks
Current answers provide incomplete solution to your problems (cross-platform + user vs system-wide config).
confuse library answers your needs :
Combine configuration data from multiple sources. Using layering, Confuse allows user-specific configuration to seamlessly override system-wide configuration, which in turn overrides built-in defaults.
[...]
An in-package config_default.yaml can be used to provide bottom-layer defaults using the same syntax that users will see. A runtime overlay allows the program to programmatically override and add configuration values. Look for configuration files in platform-specific paths. Like $XDG_CONFIG_HOME or ~/.config on Unix; “Application Support” on macOS; %APPDATA% on Windows.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With