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

如何解决AWS Glue Python脚本导入自定义utils模块报错问题

解决AWS Glue中导入自定义Python模块的问题

核心排查点:压缩包结构

  • 必须保证utils.zip的根目录就是utils文件夹本身。解压后应直接看到utils文件夹,里面包含__init__.py、redshift.py等文件,不能有额外的父目录嵌套(比如误把external_variables/utils整个压缩,导致解压后先看到external_variables文件夹)。这是触发ModuleNotFoundError最常见的原因。

Glue作业配置检查

  • 在Glue作业的Python库路径中,填写utils.zip在S3的完整路径(如s3://your-bucket/path/to/utils.zip),同时确认配置的IAM角色拥有该S3桶的s3:GetObject权限。
  • 若使用Glue 2.0及以上版本,无需手动修改PYTHONPATH,平台会自动处理库路径,重点还是压缩包结构是否正确。

替代方案:手动挂载并添加路径

如果上述配置仍无效,可以在Glue脚本开头添加代码,将S3上的utils文件夹下载到临时目录并添加到Python路径:

import sys
import os
import boto3
from awsglue.utils import getResolvedOptions

# 获取作业参数(规范写法,可选)
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

# 替换为你的S3上utils文件夹的完整路径
S3_UTILS_PATH = 's3://your-bucket/path/to/utils'
LOCAL_UTILS_DIR = '/tmp/utils'

# 创建本地临时目录
os.makedirs(LOCAL_UTILS_DIR, exist_ok=True)

# 解析S3路径,下载整个utils文件夹
s3 = boto3.resource('s3')
bucket_name = S3_UTILS_PATH.split('/')[2]
prefix = '/'.join(S3_UTILS_PATH.split('/')[3:])

for obj in s3.Bucket(bucket_name).objects.filter(Prefix=prefix):
    if not obj.key.endswith('/'):
        # 拼接本地文件路径
        local_file = os.path.join(LOCAL_UTILS_DIR, os.path.basename(obj.key))
        s3.Bucket(bucket_name).download_file(obj.key, local_file)

# 将临时目录添加到Python路径
sys.path.append('/tmp')

# 现在可以正常导入模块
from utils.redshift import connect_redshift, save_to_redshift
from utils.scriptcase import connect_sc, read_from_script_case

额外注意项

  • 确保utils文件夹内的__init__.py存在(可以是空文件),这是Python识别为合法包的必要条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:57:34