Загрузка config.jon из файла egg в Airflow

#python #airflow #setuptools #egg

#python #воздушный поток #setuptools #egg

Вопрос:

Как я могу загрузить файл конфигурации из файла egg? Я пытаюсь запустить код python, который упаковывается как файл egg в Airflow. В коде он пытается загрузить файл config.json, который не запускается в Airflow. Я думаю, проблема в том, что он пытается прочитать файл из файла egg, и поскольку он заархивирован, он не может его найти. Я обновил setup.py как показано ниже, чтобы убедиться, что конфигурационный файл находится в pckage:

 from setuptools import find_packages, setup

setup(
    name='tv_quality_assurance',
    packages=find_packages(),
    version='0.1.0',
    description='Quality checks on IPTV linear viewing data',
    author='Sarah Berenji',
    data_files=[('src/codes', ['src/codes/config.json'])],
    include_package_data=True,
    license='',
)
  

Теперь он жалуется, что config_file_path это не каталог:

 NotADirectoryError: [Errno 20] Not a directory: '/opt/artifacts/project-0.1.0.dev8-py3.6.egg/src/codes/config.json'
  

Я проверил путь, и файл json находится там. Вот мой код с некоторым оператором печати, добавленным в debug, который показывает, что он не отображается config_file_path как файл или каталог:

 dir_path = os.path.dirname(__file__)
config_file_path = dir_path   '/config.json'

print(f"config_file_path = {config_file_path}")
print(f"relpath(config_file_path) = {os.path.relpath(config_file_path)}")

if not os.path.isfile(config_file_path):
    print(f"{config_file_path} is not a file")
if not os.path.isdir(config_file_path):
    print(f"{config_file_path} is not a dir")

with open(config_file_path) as json_file:
    config = json.load(json_file)
  

Он возвращает следующие выходные данные:

 config_file_path = /opt/artifacts/project-0.1.0.dev8-py3.6.egg/src/codes/config.json
relpath(config_file_path) = ../../artifacts/project-0.1.0.dev8-py3.6.egg/src/codes/config.json
/opt/artifacts/project-0.1.0.dev8-py3.6.egg/src/codes/config.json is not a file
/opt/artifacts/project-0.1.0.dev8-py3.6.egg/src/codes/config.json is not a dir

Traceback (most recent call last):
File "/opt/test_AF1.10.2_py2/dags/py_spark_entry_point.py", line 8, in <module>
execute(spark)
File "/opt/artifacts/project-0.1.0.dev8-py3.6.egg/src/entry_point.py", line 26, in execute
File "/opt/artifacts/project-0.1.0.dev8-py3.6.egg/src/codes/data_methods.py", line 32, in load_config_file
NotADirectoryError: [Errno 20] Not a directory: '/opt/artifacts/project-0.1.0.dev8-py3.6.egg/src/codes/config.json'
  

В качестве моей следующей попытки я попытался использовать importlib_resources , но в итоге получил странную ошибку, что модуль не установлен, но журнал показывает, что он был успешно установлен с помощью pip: ModuleNotFoundError: No module named 'importlib_resources'

 import importlib_resources

config_file = importlib_resources.files("src.codes") / "config.json"
with open(config_file) as json_file:
    config = json.load(json_file)
  

Ответ №1:

Мне просто удалось сделать это с помощью pkg_resources :

 config_file = pkg_resources.resource_stream('src.codes', 'config.json')
config = json.load(config_file)