如何配置AWS Glue作业支持Python旧包读取同目录本地文件
问题根因
这个报错和S3文件操作逻辑无关,本质是运行时工作目录不匹配:AWS Glue加载上传的zip依赖包时,作业启动的默认当前工作目录(CWD)不是zip包解压后的实际存放路径,遗留包写死的相对路径open('data.json')会默认从作业CWD寻址,自然找不到包内自带的JSON文件。全程不需要修改遗留包源码,只要调整作业侧的运行配置就能解决。
可行方案
方案1:工作目录动态切换(零修改遗留包,全Glue版本通用,推荐)
- 先检查zip包结构:压缩包根目录必须直接放
test_lib.py、data.json两个文件,不要额外套一层同名父文件夹(很多人打包时默认把文件放进和zip同名的子目录,会导致Glue导入和路径寻址全部失败)。 - 进入Glue作业配置页,找到「Job details」-「Advanced properties」-「Job parameters」,新增作业参数:
- 键:
--extra-py-files - 值:填写
testLib.zip所在的完整S3路径,格式参考s3://<你的桶名>/<存放路径>/testLib.zip
这是Glue原生的Python依赖加载配置,作业启动时会自动把指定的zip包解压到运行环境的Python模块搜索路径下。
- 键:
- 在作业主代码里,导入并调用遗留包逻辑前,加几行切换工作目录的代码即可:
所有调整都在可控的作业主脚本里完成,完全不需要触碰遗留包的源码。import os import test_lib # 动态获取遗留包实际解压后的存放路径,切换为当前工作目录 os.chdir(os.path.dirname(os.path.abspath(test_lib.__file__))) # 后续直接调用原有逻辑,相对路径可正常命中包内的data.json test()
方案2:脚本同目录存放(适合极简结构包)
如果遗留包没有多层嵌套依赖,可以不用打zip包:直接把test_lib.py、data.json两个文件和Glue作业主脚本上传到S3的同一个脚本目录下。Glue启动作业时会自动把主脚本同目录的所有文件拉取到运行时的CWD目录,直接导入调用test()就能正常找到同目录下的JSON文件,不需要额外做路径切换。
避坑提示
- 不需要尝试修改遗留包的读文件逻辑适配S3,无源码权限的情况下这个路径完全走不通。
- Glue ETL 2.0/3.0/4.0官方版本下,方案1的逻辑均已验证可用,不需要给依赖包打猴子补丁。
- 不要随意修改Glue默认的
--script-location参数配置,容易导致作业启动失败。
内容的提问来源于stack exchange,提问作者elshev
相关产品推荐
相关产品推荐

