Example of how to read a file from a python package subdirectory:
Introduction
Let's assume that we want to create a new python package (called "ideas4eo") from scratch and that we store some data in a json file located in a subdirectory (ideas4eo/data/user):
ideas4eo/data/user/__init__.pyconfig.jsondata_order/__init__.pynasa_laads_daac.py
the config.json file (that contain a user token):
{"nasa_laads_daac": {"token": "123456789"}}
and we need to read the json file from a python script called nasa_laads_daac.py located in the subdirectory ideas4eo/data_order.
(Option 1) Create a function that read a file from a python package subdirectory
If you try to read the json file from nasa_laads_daac.py using a relative path ('../data/user/data.json') it is not going to work:
import jsonwith open('../data/user/data.json') as json_data:config_data = json.load(json_data)token = config_data['nasa_laads_daac']['token']
To read the json file, a solution is to use pkg_resources from setuptools, example
import pkg_resourcesimport jsondef get_token():err_msg = []try:data_path = pkg_resources.resource_filename('ideas4eo.data.user', 'config.json')with open(data_path) as json_data:config_data = json.load(json_data)token = config_data['nasa_laads_daac']['token']except:err_msg.append("Token Not found")token = -1return err_msg, token
(Option 2) Create a function that read a file from a python package subdirectory
Another possible solution is to use importlib.resources – Resources. See stackoverflow: How to read a (static) file from inside a Python package? to learn more.
Test if the file is read
To test if it works, start python outside the package (for example just above ideas4eo reperestory) and enter
>>> import ideas4eo.data_order.nasa_laads_daac as t>>> t.get_token()'123456789'
