What is the best method for setting up a config file in Python
If you really want to use an environment-based YAML configuration, you could do so like this:
config.py
import yaml
import os
config = None
filename = getenv('env', 'default').lower()
script_dir = os.path.dirname(__file__)
abs_file_path = os.path.join(script_dir, filename)
with open(abs_file_path, 'r') as stream:
try:
config = yaml.load(stream)
except yaml.YAMLError as exc:
print(exc)
Best practice for keeping a config file in python
I'm not sure exactly what the best practice is but I like using JSON files. I use the following class as a layer of abstraction for interfacing with the config (properties) file. You can create one JSONPropertiesFile and pass it around your application.
import json
from collections import OrderedDict
import os
from stat import * # ST_SIZE etc
from datetime import datetime
from copy import deepcopy
class JSONPropertiesFileError(Exception):
pass
class JSONPropertiesFile(object):
def __init__(self, file_path, default={}):
self.file_path = file_path
self._default_properties = default
self._validate_file_path(file_path)
def _validate_file_path(self, file_path):
if not file_path.endswith(".json"):
raise JSONPropertiesFileError(f"Must be a JSON file: {file_path}")
if not os.path.exists(file_path):
self.set(self._default_properties)
def set(self, properties):
new_properties = deepcopy(self._default_properties)
new_properties.update(properties)
with open(self.file_path, 'w') as file:
json.dump(new_properties, file, indent=4)
def get(self):
properties = deepcopy(self._default_properties)
with open(self.file_path) as file:
properties.update(json.load(file, object_pairs_hook=OrderedDict))
return properties
def get_file_info(self):
st = os.stat(self.file_path)
res = {
'size':st[ST_SIZE],
'size_str':str(round(st[ST_SIZE]/1000,2)) + ' KB',
'last_mod': datetime.fromtimestamp(st[ST_MTIME]).strftime("%Y-%m-%d")
}
return res
In your case you might use it like this:
file_path = "path/to/your/config/file"
default_properties = {
'PROD': 'production',
'DEV': 'dev',
'ENVIRONMENT': ""
}
config_file = JSONPropertiesFile(file_path, default_properties)
config = config_file.get()
print(config["PROD"])
config["PROD"] = "something else"
config_file.set(config) # save new config
Best practice on how to integrate a settings file for the init of an own python package?
Put the credentials in your environment. It is safer. Then create a file called settings.py or anything you want and do something like this:
DATABASES = {
'default': {
'ENGINE': 'your_engine',
'USER': os.environ.get('DB_USER'),
'PASSWORD': os.environ.get('DB_PASSWORD'),
'HOST': '127.0.0.1',
'PORT': '5432',
'NAME': os.environ.get('DB_NAME'),
}
}
How to read a config file using python
In order to use my example, your file "abc.txt" needs to look like this.
[your-config]
path1 = "D:\test1\first"
path2 = "D:\test2\second"
path3 = "D:\test2\third"
Then in your code you can use the config parser.
import ConfigParser
configParser = ConfigParser.RawConfigParser()
configFilePath = r'c:\abc.txt'
configParser.read(configFilePath)
As human.js noted in his comment, in Python 3, ConfigParser
has been renamed configparser
. See Python 3 ImportError: No module named 'ConfigParser' for more details.
What's the official way of storing settings for Python programs?
Depends on the predominant intended audience.
If it is programmers who change the file anyway, just use python files like settings.py
If it is end users then, think about ini files.
Related Topics
What Determines Which Strings Are Interned and When
Typeerror: Can Only Concatenate Str (Not "Float") to Str
How to Normalize a Numpy Array to a Unit Vector
Pandas Dataframe with Multiindex Column - Merge Levels
Importing from a Relative Path in Python
Websocket VS Rest API for Real Time Data
Pycharm Current Working Directory
Not All Parameters Were Used in the SQL Statement (Python, MySQL)
Changing Iteration Variable Inside for Loop in Python
Multiple Linear Regression in Python
How to Remove Gaps Between Subplots in Matplotlib
Import Multiple Excel Files into Python Pandas and Concatenate Them into One Dataframe
Cannot Pass an Argument to Python with "#!/Usr/Bin/Env Python"
How to Get Python's Elementtree to Pretty Print to an Xml File