问题描述
我在AWS上具有以下lambda函数
import os
import sys
sys.path.insert(0,'/opt')
def tc1(event,context):
print("in tc1")
os.system("pytest /tests/Test_preRequisites.py -s -v")
os.system("python -m pytest /tests/Test_preRequisites.py -s -v")
Response:
null
Request ID:
"8e8738b7-9h28-4379-b814-688da8c31d58"
Function logs:
START RequestId: 8e8738b7-9h28-4379-b814-688da8c31d58 Version: $LATEST
in tc1
sh: pytest: command not found
/var/lang/bin/python: No module named pytest
END RequestId: 8e8738b7-9h28-4379-b814-688da8c31d58
REPORT RequestId: 8e8738b7-9h28-4379-b814-688da8c31d58 Duration: 38.46 ms Billed Duration: 100 ms Memory Size: 2048 MB Max Memory Used: 57 MB Init Duration: 123.66 ms
我可以理解,lambda函数无法从这些错误sh: pytest: command not found
和/var/lang/bin/python: No module named pytest
中找到pytest模块
我尝试运行pytest命令以及python -m pytest命令,两者都给出相同的错误。
但是,我已经添加了一个zip文件作为一个图层,并将该图层添加到了该lambda函数中。
我通过命令pip install pytest -t C:\Users\admin\dependencies
在本地计算机上将pytest安装到了文件夹中
然后压缩该文件夹的内容并将其上传到AWS上的图层。
仍然无法访问pytest模块。
这在本地环境中的本地计算机上运行良好。此问题仅发生在AWS lambda上,因此脚本可以正常工作。
任何人都可以让我知道需要在此处添加或修改什么才能使此功能正常运行。 谢谢。
解决方法
将依赖项放在Python层的“ python”目录中,如下所示:
pip install pytest -t C:\Users\admin\dependencies\python
然后像以前一样压缩“ dependencies”文件夹中的内容。该zip文件将包含一个目录“ python”,并在其中包含您的依赖项。
,这是因为 Lambda 环境中没有入口点。当您正常安装 pytest 时,由于项目的 setup.cfg 中的 pytest
值,您会得到一个 options.entry_points
脚本(在此处找到:https://github.com/pytest-dev/pytest/blob/main/setup.cfg)
如果您将软件包安装到 virtualenv 并导航到 /bin 目录,您将看到一个 pytest
脚本位于其中。这就是您在 CLI 上调用 pytest 命令时通常执行的操作。如果您希望能够使用它,您的 Lambda 需要该脚本的一个版本。
作为参考,这是该脚本中的内容:
#!/path/to/venv/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from pytest import console_main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$','',sys.argv[0])
sys.exit(console_main())
我自己没有验证过,但我怀疑在此脚本中将 shebang 更改为 #!/usr/bin/env python
会导致它在 Lambda 中工作。另请注意,由于您的依赖项通常最终转储到与 Lambda 包中的代码相同的目录中,您可能需要为脚本使用不同的名称(因为名称 pytest
已被目录使用)