Cloud Composer中DAG跨目录调用外部模块的实现方案咨询
Cloud Composer调用外部模块的可行方案
方案1:规范模块结构(最基础的解决方式)
- 在
plugins/github_my_repository_deployed-testing/planning/目录下创建空的__init__.py文件,让Python将planning识别为合法模块。 - 修改导入语句为绝对路径:
注:Cloud Composer默认会把from github_my_repository_deployed-testing.planning.modules_1 import get_dataplugins目录加入Python的搜索路径,所以上层的github_my_repository_deployed-testing需要作为包的前缀。
方案2:动态添加模块路径
- 在DAG文件开头插入代码,把目标模块所在的目录手动加入Python的搜索路径:
import sys from pathlib import Path # 从当前DAG文件路径向上回溯,定位到plugins下的仓库目录 target_dir = Path(__file__).parent.parent.parent / "plugins" / "github_my_repository_deployed-testing" sys.path.append(str(target_dir)) # 此时可正常导入 from planning.modules_1 import get_data - 注意:路径计算要和你的存储桶结构严格对应,后续如果部署目录变动,需要同步调整这段代码。
方案3:打包成Python依赖(长期稳定方案)
- 把
planning模块打包成标准Python包:- 在仓库根目录编写
setup.py或pyproject.toml,定义包名、版本等信息。 - 执行
python -m build生成wheel/tar.gz格式的包文件。 - 在Cloud Composer环境的依赖配置中,上传该包文件(或如果包已发布到PyPI,直接填写包名)。
- 在仓库根目录编写
- 这种方式下,模块会被安装到Python环境的site-packages,导入逻辑和普通第三方包一致,不受存储桶目录结构影响。
方案4:调整部署目录结构
- 修改
cloudbuild.yaml的部署步骤,直接将planning目录复制到plugins根目录,而非嵌套在仓库名称子目录下:- name: 'gcr.io/cloud-builders/gsutil' args: ['cp', '-r', './planning', 'gs://cloud-composer-bucket/plugins/'] - 部署完成后,
planning目录直接在plugins下,Python可直接识别,原导入语句from planning.modules_1 import get_data即可正常工作。
内容的提问来源于stack exchange,提问作者MADFROST
相关产品推荐
相关产品推荐

