AWS Glue脚本使用pg8000报ModuleNotFoundError求助
AWS Glue中pg8000库导入失败(ModuleNotFoundError)排查与解决
可能的问题点及对应解决方案
1. ZIP包内部结构错误
你的ZIP包需要直接在根目录包含pg8000模块文件夹(里面包含__init__.py及其他库文件),而非嵌套目录结构。
- 验证方式:本地解压
pg8000libs.zip,确认根目录下直接存在pg8000/文件夹,而非类似pg8000libs/pg8000/的嵌套结构。 - 正确打包方式:在本地对应Python版本的环境中执行
pip install pg8000 -t ./pg8000libs,进入pg8000libs目录后,将所有文件/文件夹打包为zip(注意不要把pg8000libs本身作为根目录打包)。
2. 冗余的sys.path手动配置
Glue的--extra-py-files参数会自动将指定的ZIP包添加到Python路径中,无需手动执行sys.path.insert(0, zip_path)。多余的路径插入可能导致加载顺序异常,直接删除以下两行代码:
zip_path = os.path.join('/tmp', 'pg8000libs.zip') sys.path.insert(0, zip_path)
3. S3文件权限不足
确保Glue Job的执行IAM角色拥有对s3://mybucket/pg8000libs.zip的s3:GetObject权限,检查角色的权限策略是否包含对应S3资源的读取权限。
4. Python版本兼容性不匹配
Glue不同版本对应不同Python版本(如Glue 3.0对应Python 3.7),需安装与该版本兼容的pg8000版本:
- 例如Glue 3.0需安装
pg8000<=1.29.1(该版本支持Python 3.7),避免安装仅支持Python 3.8+的高版本pg8000。 - 打包时务必在对应Python版本的环境下执行
pip install,保证依赖包的兼容性。
5. Job参数配置格式错误
确保--extra-py-files参数的配置无多余注释,控制台配置时仅保留路径值:
--extra-py-files s3://mybucket/pg8000libs.zip
(移除原配置中的//NOTE: my zip contains __init__.py注释,避免被解析为参数的一部分)
修正后的示例代码
import sys import os from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job import boto3 from pyspark.sql import Row from datetime import datetime, date def dump_python_path(): print("python path:", sys.path) for path in sys.path: if os.path.isdir(path): print(f"dir: {path}") print("\t" + str(os.listdir(path))) print(path) print(os.listdir('/tmp')) dump_python_path() # Import the library import pg8000
内容的提问来源于stack exchange,提问作者noobie-php
相关产品推荐
相关产品推荐

