将 pytz 导入 AWS lambda 函数

问题描述 投票:0回答:8

我正在编写一个与日期时间一起使用的 lambda 函数,并尝试导入 pytz,这样我就可以在比较时考虑时区。

import boto3
import pytz
from datetime import timedelta, date, datetime
from boto3.dynamodb.conditions import Key, Attr

导致显示此内容

{errorMessage=Unable to import module 'lambda_function'}

但是当我删除 import pytz 时,该函数会触发(如果没有时区信息,它就无法正常工作)

python python-3.x timezone aws-lambda pytz
8个回答
29
投票

如果您在您的环境中无法访问

pytz
,也许您可以访问
python-dateutil
。在这种情况下你可以这样做:

import datetime
import dateutil.tz

eastern = dateutil.tz.gettz('US/Eastern')
datetime.datetime.now(tz=eastern)

参考。 导入 pytz 失败时如何获取太平洋时区的当前时间?


14
投票

您需要安装 pytz 软件包,以便它可用于您的 lambda。 执行此操作的方法是让 pip 将其安装到您要压缩并上传到 AWS 的目录中(即与包含 lambda 函数的文件进行对等)。

pip install -t path/to/your/lambda pytz

然后当你将其压缩并上传时,就可以使用了。

编辑添加,我创建了一个工具来为您做很多事情 - 您可以在这里找到它:https://github.com/jimjkelly/lambda-deploy


3
投票

为了跟进 @cheframzi 对“以 python/pytz/... 格式打包 pytz zip 文件”作为 Lambda 层的回答,以下是一种方法。

mkdir python
pip3 install -t python pytz=='2019.2'
zip -r pytz.zip python
rm -rf python

然后您可以使用

aws lambda publish-layer-version --layer-name <layer_name> --zip-file fileb://./pytz.zip
部署该层的新版本。

只要该库安装在 zip 文件的

python/pytz
级别,AWS Lambda 就应该能够找到它。您也可以将其放入
python/lib/python3.8/site-packages\pytz
中,但对于此处的特定 python 运行时版本:https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html


2
投票

我今天遇到了这个问题。我解决的方法是

  • 以 python/pytz/... 格式打包 pytz zip 文件
  • 创建了 Lambda 层 enter image description here
  • 在我的 lambda 中使用了上面的层

1
投票

我花了几个小时来解决这个 pytz 问题。 使用 AWS,您可以尝试使用“dateutil.tz”中的 gettz 方法。 这样你就可以获得 pytz 所期望的结果。 就我而言,我需要 isoformat 时间(采用 (+00:00) 时区的 utc)。

from datetime import datetime
from dateutil.tz import gettz
datetime.now(gettz('UTC')).isoformat() # same result as datetime.now(pytz.utc).isoformat()

0
投票

您还可以添加公共 ARN 作为 Lambda 层,我使用了这个 https://dev.to/vumdao/create-cron-jobs-on-aws-lambda-with-cloudwatch-event-3e07


0
投票

我添加了 Panda for Python 层,其中似乎包含 pytz。添加此图层后错误消失了。

enter image description here


-1
投票
import datetime as dt
import dateutil.tz

aesttime = dateutil.tz.gettz('Australia/Brisbane')
print(dt.datetime.now(tz=aesttime).strftime(format="%Y-%m-%d %H:%M:%S"))
© www.soinside.com 2019 - 2024. All rights reserved.