You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AWS CDK glue-alpha作业的extraPythonFiles中导入模块?

如何在AWS Glue Job中直接导入通过extraPythonFiles传入的自定义模块?

问题背景

使用AWS CDK的@aws-cdk/aws-glue-alpha库创建Glue Job时,通过extraPythonFiles参数传入自定义模块my_module.py,CDK定义代码如下:

new glueAlpha.Job(this, id + '-aggregate', {
  jobName: id + '-aggregate',
  executionClass: glueAlpha.ExecutionClass.FLEX,
  sparkUI: { enabled: true },
  role: iam.Role.fromRoleName(this, id, 'service-role/AWSGlueServiceRole'),
  workerCount: 2,
  workerType: glueAlpha.WorkerType.G_1X,
  defaultArguments: { '--environment_tag': env_tag, '--s3_bucket': dataBucket.bucketName },
  executable: glueAlpha.JobExecutable.pythonEtl({
    glueVersion: glueAlpha.GlueVersion.V3_0,
    pythonVersion: glueAlpha.PythonVersion.THREE,
    script: glueAlpha.Code.fromAsset(glueSourceCode + '/data_quality.py'),
    extraPythonFiles: [glueAlpha.Code.fromAsset(sourceCode + '/my_module.py')],
  }),
});

部署后,该模块文件会以随机哈希命名的形式存放在Glue临时文件系统中(如/tmp/localPyFiles-xxx/xxxxxxx.py),无法直接通过import my_module导入,需要解决无需依赖临时路径直接导入的问题。

解决方案

方法1:将模块打包为标准Python包结构(推荐)

把自定义模块整理成标准包结构后打包为zip,让Glue自动识别模块名称:

  1. 创建一个目录(例如my_package),将my_module.py放入该目录
  2. 将目录打包为my_package.zip(确保zip内直接包含my_package目录,避免多层嵌套)
  3. 修改CDK代码中的extraPythonFiles配置,指向这个zip文件:
extraPythonFiles: [glueAlpha.Code.fromAsset(sourceCode + '/my_package.zip')],
  1. 在Glue作业脚本data_quality.py中,直接执行导入:
from my_package import my_module

方法2:在作业脚本中动态重命名临时文件

在作业脚本开头添加代码,定位临时路径中的随机命名文件并重命名为模块名,之后即可正常导入:

import os
import sys
import shutil

# 定位临时文件目录
try:
    local_py_dir = next(d for d in sys.path if d.startswith('/tmp/localPyFiles'))
except StopIteration:
    raise RuntimeError("找不到localPyFiles临时目录")

# 获取目录中的Python文件
py_files = [f for f in os.listdir(local_py_dir) if f.endswith('.py')]
if len(py_files) != 1:
    raise RuntimeError("临时目录中Python文件数量异常")

# 重命名为my_module.py
src_path = os.path.join(local_py_dir, py_files[0])
dst_path = os.path.join(local_py_dir, 'my_module.py')
shutil.move(src_path, dst_path)

# 现在可以正常导入模块
import my_module

方法3:直接指定S3路径并配合包结构

如果不想通过CDK的Code.fromAsset上传文件,可以手动将打包好的zip文件上传到S3,然后在Glue Job的defaultArguments中添加--extra-py-files参数:

defaultArguments: {
  '--environment_tag': env_tag,
  '--s3_bucket': dataBucket.bucketName,
  '--extra-py-files': 's3://your-bucket/path/to/my_package.zip'
},

之后同样可以在作业脚本中直接导入模块。

内容的提问来源于stack exchange,提问作者Gabriele

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:45:00