如何解决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
相关产品推荐
相关产品推荐

