Я пытаюсь использовать apache airlfow
с упакованными пакетами (https://airflow.apache.org/docs/stable/concepts.html#packaged -dags ).
Я написал свой код как пакет python и, очевидно, мой код зависит от других популярных библиотек, таких как numpy, scipy et c.
РЕДАКТИРОВАТЬ: Это setup.py
из моего пользовательского пакета python:
from setuptools import setup, find_packages
from pathlib import Path
from typing import List
import distutils.text_file
def parse_requirements(filename: str) -> List[str]:
"""Return requirements from requirements file."""
# Ref: https://stackoverflow.com/a/42033122/
return distutils.text_file.TextFile(filename=str(Path(__file__).with_name(filename))).readlines()
setup(name='classify_business',
version='0.1',
python_requires=">=3.6",
description='desc',
url='https://urlgitlab/datascience/classifybusiness',
author='Marco fumagalli',
author_email='marco.fumagalli@mycompany.com',
packages = find_packages(),
license='MIT',
install_requires=
parse_requirements('requirements.txt'),
zip_safe=False,
include_package_data=True)
требования. txt содержит пакеты (vertica_ python, pandas, numpy et c) вместе с их версией, необходимой для моего кода.
Я написал небольшой сценарий оболочки, основанный на предоставленном в do c:
set -eu -o pipefail
if [ $# == 0 ]; then
echo "First param should be /srv/user_name/virtualenvs/name_virtual_env"
echo "Second param should be name of temp_directory"
echo "Third param directory should be git url"
echo "Fourth param should be dag zip name, i.e dag_zip.zip to be copied into AIRFLOW__CORE__DAGS__FOLDER"
echo "Fifth param should be package name, i.e classify_business"
fi
venv_path=${1}
dir_tmp=${2}
git_url=${3}
dag_zip=${4}
pkg_name=${5}
python3 -m venv $venv_path
source $venv_path/bin/activate
mkdir $dir_tmp
cd $dir_tmp
python3 -m pip install --prefix=$PWD git+$git_url
zip -r $dag_zip *
cp $dag_zip $AIRFLOW__CORE__DAGS_FOLDER
rm -r $dir_tmp
Оболочка установит мой пакет вместе с зависимостями напрямую из gitlab, zip и затем переместится в папку dags.
Это содержимое папки tmp_dir перед в архиве.
bin
lib
lib64
predict_dag.py
train_dag.py
Кажется, что Airflow не может импортировать пакет, установленный в lib или lib64. Я получаю эту ошибку
ModuleNotFoundError: Нет модуля с именем 'vertica_ python'
Я даже пытался переместить свой пользовательский пакет за пределы lib:
bin
my_custom_package
lib
lib64
predict_dag.py
train_dag.py
Но все равно появляется та же ошибка.
PS: Я думаю, что одна из проблем заключается в том, как использовать pip
для установки пакета в указанном c месте. В примере с потоком воздуха используется --install-option="--install-lib=/path/"
, но он не поддерживается:
Параметры изменения местоположения находятся в параметре --install-option: ['--install-lib'] из командной строки. Эта конфигурация может вызвать непредвиденное поведение и не поддерживается. Пип 20.2 уберет поддержку этой функциональности. Возможная замена - использование параметров уровня пипса, таких как --user, --prefix, - root и --target. Вы можете найти обсуждение относительно этого в https://github.com/pypa/pip/issues/7309.
Использование --prefix
приводит к структуре, подобной выше, с ошибкой не найденного модуля.
Использование --target
ведет к каждому пакету, установленному в указанном каталоге. В этом случае у меня возникает ошибка pandas
C extension: No module named 'pandas._libs.tslibs.conversion' not built
Я предполагаю, что это связано с динамическими c библиотеками, которые должны быть доступны на системном уровне?
Есть подсказка?
Спасибо