If conf
is a Python package then you could use pkgutil.get_data()
:
import pkgutil
data = pkgutil.get_data("conf", "constants.cfg")
Or if setuptools
is installed – pkg_resources.resource_string()
:
import pkg_resources
data = pkg_resources.resource_string('conf', 'constants.cfg')
If constants.cfg
is not in a package then pass its path as a command-line parameter, or set it in an environment variable e.g., CONFIG_MANAGER_CONSTANTS_PATH
, or read from a fixed set of default paths e.g., os.path.expanduser("~/.config/ConfigManager/constants.cfg")
. To find a place where to put user data, you could use appdirs
module.
You can't use os.getcwd()
that returns current working directory if you may run ConfigManager.py
from different directories. Relative path "../../..."
won't work for the same reason.
If you are certain that the relative position of ConfigManager.py
and constants.cfg
in the filesystem won't change:
import inspect
import os
import sys
def get_my_path():
try:
filename = __file__ # where we were when the module was loaded
except NameError: # fallback
filename = inspect.getsourcefile(get_my_path)
return os.path.realpath(filename)
# path to ConfigManager.py
cm_path = get_my_path()
# go 6 directory levels up
sp_path = reduce(lambda x, f: f(x), [os.path.dirname]*6, cm_path)
constants_path = os.path.join(sp_path, "conf", "constants.cfg")