如何用Setuptools生成Python根级别handlers包?
解决Python包生成问题:让handlers作为根级包
看起来你现在的问题是打包后subfolder1和subfolder2变成了独立的顶级包,而不是属于handlers的子包。这主要是因为setuptools没正确识别到handlers作为根包的位置,咱们一步步来调整:
1. 确认项目结构与__init__.py文件
首先确保你的目录结构里,每个需要被识别为包的目录都有__init__.py(空文件就行),结构应该是这样:
src/ controller/ handlers/ __init__.py subfolder1/ __init__.py file1.py subfolder2/ __init__.py file2.py setup.py
如果handlers目录下没有__init__.py,setuptools不会把它当作一个包,只会把下面的subfolder1/subfolder2当作独立包,这是关键!
2. 修改setup.py配置
你的原setup.py用了find_packages()但没指定查找路径,导致它从当前目录(setup.py所在目录)开始找,找不到handlers这个包,反而找到了src/controller/handlers下的subfolder1/subfolder2。咱们调整两个参数:
package_dir:告诉setuptools,顶级包的根目录在哪里find_packages(where="..."):指定从哪个目录开始查找包
修改后的setup.py代码:
from setuptools import setup, find_packages setup( name="handlers", version="1.0", description="AWS Lambda handlers package", # 表示顶级包(比如handlers)在src/controller目录下 package_dir={"": "src/controller"}, # 从src/controller目录开始查找所有包 packages=find_packages(where="src/controller"), install_requires=[ 'structlog==19.2.0', 'python-json-logger==0.1.10' ], include_package_data=True, zip_safe=False )
如果你不想用find_packages,也可以直接指定所有包(包括子包):
packages=["handlers", "handlers.subfolder1", "handlers.subfolder2"], package_dir={"": "src/controller"},
3. 测试打包与安装
先卸载之前可能安装过的旧版本(避免缓存干扰):
pip uninstall -y handlers
然后用开发模式安装(方便调试):
pip install -e .
安装完成后,你可以在Python环境里测试导入:
from handlers.subfolder1 import file1 from handlers.subfolder2 import file2
如果能成功导入,说明包结构已经正确了。
4. 配置AWS SAM Toolkit
在PyCharm的SAM模板(template.yaml)里,Handler路径要对应新的包结构,格式是handlers.子包名.文件名.函数名,比如:
Resources: YourLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: src/controller/ Handler: handlers.subfolder1.file1.lambda_handler # 这里要对应你的函数名 Runtime: python3.9 # 换成你用的Python版本
这样SAM本地部署时,就能正确找到handlers包下的子模块了。
内容的提问来源于stack exchange,提问作者amrit chhetri
相关产品推荐
相关产品推荐

