"errorMessage": "Unable to import module 'app': No module named 'requests'", "errorType": "Runtime.ImportModuleError"
"errorMessage": "Unable to import module 'app': No module named 'requests'", "errorType": "Runtime.ImportModuleError"
这是我在尝试测试我的 Lambda 函数时遇到的错误
"errorMessage": "Unable to import module 'app': No module named 'requests'",
"errorType": "Runtime.ImportModuleError",
"requestId": "baef5cbe-c542-4ae0-9d3e-bda4ee80f0b9",
"stackTrace": []
}
这也是我的python代码
import requests
import os
import smtplib
from datetime import datetime
# https://openweathermap.org/api/one-call-api
# empire state building
lat = '40.75009231913161'
lon = '-73.98638285425646'
exclude = 'minutely,hourly,alerts'
url = (
'https://api.openweathermap.org/data/2.5/onecall?' +
'lat={lat}&lon={lon}&exclude={exclude}&appid={API_key}&units=imperial'
)
if os.path.isfile('.env'):
from dotenv import load_dotenv
load_dotenv()
def __send_email(msg: str) -> None:
gmail_user = os.getenv('EMAIL_USER')
gmail_password = os.getenv('EMAIL_PASSWORD')
# Create Email
mail_from = gmail_user
mail_to = gmail_user
mail_subject = f'Weather Today {datetime.today().strftime("%m/%d/%Y")}'
mail_message = f'Subject: {mail_subject}\n\n{msg}'
# Send Email
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(gmail_user, gmail_password)
server.sendmail(mail_from, mail_to, mail_message)
server.close()
def handler(event, context):
response = requests.get(url.format(
lat=lat,
lon=lon,
exclude=exclude,
API_key=os.getenv('WEATHER_API_KEY')
))
data = response.json()
rain_conditions = ['rain', 'thunderstorm', 'drizzle']
snow_conditions = ['snow']
today_weather = data['daily'][0]['weather'][0]['main'].lower()
if today_weather in rain_conditions:
msg = 'Pack an umbrella!'
elif today_weather in snow_conditions:
msg = 'Pack your snow boots!'
else:
msg = 'Clear skies today!'
__send_email(msg)
handler(None, None)
我注意到的一件事是 lambda 说它最多支持 python 版本 3.9 而我的代码是使用 3.10.2 编写的,这可能是导致此错误的原因吗? 运行time 设置为 3.9,我尝试将其切换为 3.7 和 3.8,但出现了不同的错误,但我无法执行 3.10.2
我是否应该创建一个 docker 容器并将其 运行 放在那里?这会有助于解决我的问题还是我的代码有问题?
您必须将 requests
库与您的应用程序捆绑在一起。 AWS docs 详细解释如何操作。
您必须为 lambda 的每个依赖项执行此操作,或者如果您有很多依赖项,请使用 lambda containers。
这是我在尝试测试我的 Lambda 函数时遇到的错误
"errorMessage": "Unable to import module 'app': No module named 'requests'",
"errorType": "Runtime.ImportModuleError",
"requestId": "baef5cbe-c542-4ae0-9d3e-bda4ee80f0b9",
"stackTrace": []
}
这也是我的python代码
import requests
import os
import smtplib
from datetime import datetime
# https://openweathermap.org/api/one-call-api
# empire state building
lat = '40.75009231913161'
lon = '-73.98638285425646'
exclude = 'minutely,hourly,alerts'
url = (
'https://api.openweathermap.org/data/2.5/onecall?' +
'lat={lat}&lon={lon}&exclude={exclude}&appid={API_key}&units=imperial'
)
if os.path.isfile('.env'):
from dotenv import load_dotenv
load_dotenv()
def __send_email(msg: str) -> None:
gmail_user = os.getenv('EMAIL_USER')
gmail_password = os.getenv('EMAIL_PASSWORD')
# Create Email
mail_from = gmail_user
mail_to = gmail_user
mail_subject = f'Weather Today {datetime.today().strftime("%m/%d/%Y")}'
mail_message = f'Subject: {mail_subject}\n\n{msg}'
# Send Email
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(gmail_user, gmail_password)
server.sendmail(mail_from, mail_to, mail_message)
server.close()
def handler(event, context):
response = requests.get(url.format(
lat=lat,
lon=lon,
exclude=exclude,
API_key=os.getenv('WEATHER_API_KEY')
))
data = response.json()
rain_conditions = ['rain', 'thunderstorm', 'drizzle']
snow_conditions = ['snow']
today_weather = data['daily'][0]['weather'][0]['main'].lower()
if today_weather in rain_conditions:
msg = 'Pack an umbrella!'
elif today_weather in snow_conditions:
msg = 'Pack your snow boots!'
else:
msg = 'Clear skies today!'
__send_email(msg)
handler(None, None)
我注意到的一件事是 lambda 说它最多支持 python 版本 3.9 而我的代码是使用 3.10.2 编写的,这可能是导致此错误的原因吗? 运行time 设置为 3.9,我尝试将其切换为 3.7 和 3.8,但出现了不同的错误,但我无法执行 3.10.2
我是否应该创建一个 docker 容器并将其 运行 放在那里?这会有助于解决我的问题还是我的代码有问题?
您必须将 requests
库与您的应用程序捆绑在一起。 AWS docs 详细解释如何操作。
您必须为 lambda 的每个依赖项执行此操作,或者如果您有很多依赖项,请使用 lambda containers。