You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Makefile向AWS Lambda上传Python库报错,求解决方案及替代方法

问题分析与解决

先看你遇到的直接错误:cp: cannot stat './AWS/.': No such file or directory,这说明Makefile里的$(PROJECT)变量要么没定义,要么你的项目目录根本不叫AWS。另外你的Makefile还有几个语法和依赖顺序的问题,导致整个build流程出错,下面一步步帮你修正。

1. 修正Makefile的核心问题

问题点拆解

  • 变量未定义/错误引用:你没看到PROJECT变量的定义,而且copy_python里的$(VIRTUAL)是笔误,应该是$(VIRTUAL_ENV);$(VIRTUAL_ENV)lib少了斜杠,变成了envlib(从错误日志里的if test -d envlib能看出来)。
  • 语法错误:copy_python的第二个if语句没写完,缺少分号和闭合的fi前的分号。
  • 依赖顺序错误:build目标的依赖顺序是clean_package copy_python build_package_tmp ...,导致copy_python先执行,但此时package/tmp目录还没创建(build_package_tmp才负责创建),而且复制项目文件的步骤放在了创建tmp目录之后,但项目目录不存在的话依然报错。

修正后的Makefile

# 先定义必要变量,替换成你的项目名
PROJECT := your-project-name
VIRTUAL_ENV := env

install: virtual

build: virtual clean_package build_package_tmp copy_python remove_unused zip

virtual:
	@echo "--> Setup and activate virtualenv"
	if test ! -d "$(VIRTUAL_ENV)"; then \
		pip install virtualenv; \
		virtualenv $(VIRTUAL_ENV); \
	fi
	@echo ""

clean_package:
	rm -rf ./package/*
	mkdir -p ./package  # 确保package目录存在

build_package_tmp:
	mkdir -p ./package/tmp/lib
	# 先检查项目目录是否存在再复制
	if test -d ./$(PROJECT)/; then \
		cp -R ./$(PROJECT)/. ./package/tmp/; \
	else \
		echo "Error: Project directory ./$(PROJECT)/ does not exist!"; \
		exit 1; \
	fi

copy_python:
	if test -d $(VIRTUAL_ENV)/lib/python2.7/site-packages/; then \
		cp -a $(VIRTUAL_ENV)/lib/python2.7/site-packages/. ./package/tmp/; \
	fi
	if test -d $(VIRTUAL_ENV)/lib64/python2.7/site-packages/; then \
		cp -a $(VIRTUAL_ENV)/lib64/python2.7/site-packages/. ./package/tmp/; \
	fi

remove_unused:
	rm -rf ./package/tmp/wheel*
	rm -rf ./package/tmp/easy-install*
	rm -rf ./package/tmp/setup-tools*

zip:
	cd ./package/tmp && zip -r ../$(PROJECT).zip .

修改说明

  • 顶部添加了PROJECT和VIRTUAL_ENV的变量定义,你需要把your-project-name改成实际的项目目录名。
  • 调整了build的依赖顺序:先创建虚拟环境,清理package,然后创建tmp目录并复制项目文件,再复制虚拟环境的依赖,最后清理无用文件并打包。
  • 给build_package_tmp添加了项目目录存在性检查,避免直接报错。
  • 修复了copy_python里的变量引用和语法错误,每个if语句都正确闭合。
  • 添加了mkdir -p ./package到clean_package,确保package目录存在。

2. 执行修正后的Makefile

  1. 把上面的Makefile保存为Maketest.mk,替换PROJECT为你的实际项目目录名。
  2. 先执行虚拟环境安装:make -f Maketest.mk install
  3. 激活虚拟环境:source env/bin/activate
  4. 安装你的项目依赖:pip install -r requirements.txt(如果有requirements的话)
  5. 执行build:make -f Maketest.mk build

3. Linux控制台端更优的上传方法

如果你觉得Makefile太麻烦,推荐几个更简单的方式:

方法一:用AWS CLI直接打包上传

  1. 先把项目文件和依赖打包到一个目录:
    # 创建临时目录
    mkdir -p lambda_package
    # 复制项目文件
    cp -R your-project/* lambda_package/
    # 复制虚拟环境的依赖(假设虚拟环境是env)
    cp -a env/lib/python2.7/site-packages/* lambda_package/
    # 清理无用文件
    rm -rf lambda_package/wheel* lambda_package/easy-install* lambda_package/setup-tools*
    # 打包
    cd lambda_package && zip -r ../lambda-deploy.zip .
    
  2. 用AWS CLI上传到Lambda:
    aws lambda update-function-code --function-name your-lambda-function --zip-file fileb://lambda-deploy.zip
    

方法二:用pip直接打包依赖到目录

如果你的项目用Python 3(强烈推荐,Python 2已经停止官方支持),可以用pip的--target参数直接把依赖安装到目标目录:

# 创建打包目录
mkdir lambda_package
# 安装依赖到目录
pip install -r requirements.txt --target lambda_package/
# 复制项目文件
cp your-project/*.py lambda_package/
# 打包
cd lambda_package && zip -r ../lambda-deploy.zip .
# 上传
aws lambda update-function-code --function-name your-lambda-function --zip-file fileb://lambda-deploy.zip

方法三:用Serverless Framework(更适合复杂项目)

Serverless Framework可以自动化Lambda的部署流程,包括打包、上传、配置管理,只需要一个serverless.yml配置文件,执行serverless deploy就能完成全流程部署,对于多函数、多环境的项目非常友好。

内容的提问来源于stack exchange,提问作者Avichal Bettoli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:24:52