Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的AWS Lambda无法导入模块_Python_Amazon Web Services - Fatal编程技术网

Python中的AWS Lambda无法导入模块

Python中的AWS Lambda无法导入模块,python,amazon-web-services,Python,Amazon Web Services,我有一个非常简单的Python,需要用作AWS Lambda函数: import pyodbc def lambda_handler(): cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};" "Server=AAA;" "Database=BBB;" "UID=CCC;"

我有一个非常简单的Python,需要用作AWS Lambda函数:

import pyodbc


def lambda_handler():
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
                      "Server=AAA;"
                      "Database=BBB;"
                      "UID=CCC;"
                      "PWD=DDD;")
cursor = cnxn.cursor()
cursor.execute("INSERT INTO [dbo].[log]([opened_by_id],[open_timestamp],[type_id],[title]) VALUES(118,GETDATE(),1,'test_1')")
cnxn.commit()
我已经使用pip安装了pyodbc,并将其作为py文件所在的文件夹。py文件和pyodbc文件夹都添加到我上传到Lambda函数控制台的zip文件中。当我测试功能时,我收到一个错误:

START RequestId: XXX Version: $LATEST
Unable to import module 'detect_last_sample': No module named 'pyodbc'

END RequestId: XXX
REPORT RequestId: YYY   Duration: 1.24 ms   Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 21 MB  
请帮助我理解我在这里遗漏了什么。非常感谢

--编辑 看起来这个问题比简单地用外部libs创建zip要复杂得多,在aws lambda中使用pyodbc本身也有问题。 无论如何,在我的搜索过程中,我发现这个repo包含预编译的库,包括pyodbc:


祝大家好运。

您的zip文件可能结构不正确。在pip安装依赖项并指定Python的正确版本时,是否建立了虚拟环境

创建一个文件夹,其中包含(i)您的代码和(ii)“站点包”文件夹的内容-然后将文件夹的“内容”(而不是文件夹)压缩并上载。像这样:

1) 创建您的虚拟环境

python3.6 -m venv /path_where_you_want_a_virtual_env/
2) 激活虚拟环境:

$source my_env/bin/activate
3) 在虚拟环境中安装依赖项:

python3.6 -m pip install pyodbc
AWS支持2.7或3.6。如果不在正确的文件夹中安装依赖项,它将不在那里

4) 将site packages文件夹的内容复制到您选择的文件夹中(可在/lib/python3.6/site packages中找到)。就我个人而言,我使用一个文件管理器来完成这项工作

5) 将.py脚本复制到同一文件夹

6) 压缩文件夹的内容(而不是文件夹本身)

转到AWS管理控制台并上载此zip文件

说真的,一旦你做了一次,它就是奶油奶酪;-)

其他编辑:

(A) .py脚本中的主例程应以如下方式开始: def lambda_处理程序(事件、上下文):


(B) 在AWS Lambda函数GUI中,您需要将Lambda处理程序设置为my_py_script_name.Lambda_处理程序(即,只需丢失.py并添加.Lambda_处理程序)

感谢您提供的详细答案!我已经完成了所有这些步骤,现在出现了一个不同的错误:“无法导入模块‘detect_last_sample’:没有名为‘detect_last_sample’的模块”。我创建了一个新的lambda函数,称为detect\u last\u sample。在py文件中,唯一的函数名为detect_last_sample,lambda函数的处理程序为detect_last_sample.detect_last_sample。请帮助我理解这里的错误。看起来lambda函数没有被正确调用。将脚本和lambda处理程序例程命名为同一个名称有点混乱。请你把你的新剧本贴出来好吗?嗨。我应该提到我的操作系统是Win 10。我的虚拟环境是C:\Users\Ehud\Envs\l1,它有一个名为Lib/site packages的文件夹。我将它的内容复制到另一个文件夹(C:\LambdaVEnv),向其中添加了一个py文件,并使用以下命令对其进行压缩:C:\ZipExe\zip.exe-r C:\LambdaVEnv\l1.zip*。处理程序返回到lambda_处理程序,如问题本身所示。pip安装中缺少了一些东西,但我看不出是什么。也许虚拟环境是错误的,我使用的命令是“mkvirtualenv C:\LambdaVEnv\new\u test\l2”,我收到这个消息“'python.exe'未被识别为内部或外部命令、可操作程序或批处理文件”,但它是以任何方式创建的,我不识别该错误。如果软件包安装在站点软件包目录中,那么就可以了。请查看我对原始答案的编辑。
zip -r myzipfile.zip *