【发布时间】:2020-05-04 14:39:49
【问题描述】:
我正在尝试将 apache airlfow 与打包的 dag (https://airflow.apache.org/docs/stable/concepts.html#packaged-dags) 一起使用。
我已将代码编写为 python 包,显然我的代码依赖于其他流行的库,例如 numpy、scipy 等。
编辑:
这是我的自定义 python 包的setup.py:
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)
requirements.txt 包含包(vertica_python、pandas、numpy 等)以及我的代码所需的版本。
我根据文档中提供的脚本编写了一个小 shell 脚本:
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
shell 将直接从 gitlab 安装我的包以及依赖项,然后将其移动到 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 在特定位置安装包。
气流示例使用--install-option="--install-lib=/path/",但不受支持:
在 --install-option 中找到的位置更改选项:['--install-lib'] 从命令行。此配置可能会导致意外行为 并且不受支持。 pip 20.2 将删除对此的支持 功能。一个可能的替代品是使用点级选项,例如 --user、--prefix、--root 和--target。您可以在https://github.com/pypa/pip/issues/7309 找到有关此的讨论。
使用--prefix 会导致类似上面的结构,找不到模块错误。
使用--target 会导致每个软件包都安装在指定目录中。
在这种情况下,我有一个与熊猫相关的错误
C extension: No module named 'pandas._libs.tslibs.conversion' not built
我猜它与应该在系统级别可用的动态库有关?
有什么提示吗?
谢谢
【问题讨论】:
-
在您的自定义 DAG 包 setup.py 文件中,缺少的
vertica_python包是否列为install_requires包?还是单独安装的? -
所有包(vertica_python、pandas、numpy 等)都与我的自定义包一起安装在 setup.py 中。查看编辑问题