如何在AWS Glue脚本中正确导入Python模块?相关疑问求解
先明确你的mymath2.zip的实际结构:
mymath2.zip ├─ mymath2.py └─ Connection/ └─ connection.py
针对你的四个疑问逐一解释:
1. 为何import mymath2能生效?
AWS Glue会将你指定的S3 zip包的根目录添加到Python的sys.path中,根目录下的mymath2.py属于顶级模块,符合Python的模块导入规则,因此直接import mymath2可以正常识别。
2. 为何import mymath2.Connection无法工作?
你误解了模块结构:mymath2是单个.py文件(不是包目录),而Connection是和它同级的独立目录,并非mymath2的子包。另外,Connection目录缺少__init__.py文件——这是Python识别目录为合法包的必要条件,即使它是顶级目录,没有这个文件也无法被当作包导入。
3. 为何from mymath2.Connection import connection无法工作?
原因和上面一致:
Connection不是mymath2模块的子目录,你的导入路径完全不符合实际文件结构;Connection目录没有__init__.py,不满足Python包的要求,无法被导入。
4. 为何from mymath2 import mymath2无法工作?
mymath2是模块名(对应mymath2.py),这条语句的意思是从mymath2模块中导入名为mymath2的成员(比如类、函数、变量),但你的mymath2.py里大概率没有定义这个名称的成员。如果只是想导入整个模块,直接import mymath2即可;如果要导入模块内的特定成员,需要明确写成员名,比如from mymath2 import calculate_sum。
修复方案
方案1:将mymath2改为包含子包的结构
如果想让mymath2作为根包,包含Connection子包,调整zip结构为:
mymath2.zip └─ mymath2/ ├─ __init__.py # 空文件即可 ├─ core.py # 原mymath2.py的内容移到这里,或者直接写入__init__.py └─ Connection/ ├─ __init__.py # 空文件即可 └─ connection.py
调整后即可正常使用以下导入语句:
import mymath2import mymath2.Connectionfrom mymath2.Connection import connection
方案2:单独修复Connection目录的导入问题
如果不想调整整体结构,给Connection目录添加空的__init__.py文件,zip结构变为:
mymath2.zip ├─ mymath2.py └─ Connection/ ├─ __init__.py └─ connection.py
此时可以直接导入Connection包:
from Connection import connection # 或者 import Connection.connection
注意:确保zip包上传到S3后,Glue作业的「Python library path」已正确指定该zip的S3路径,且作业角色拥有访问该S3资源的权限。
内容的提问来源于stack exchange,提问作者Abhijeet Kelkar

