Python 3.x 原因:无法导入模块';处理程序';:没有名为';帕拉米科;?
我需要将带有aws lambda的文件从SFTP服务器移动到我的aws帐户, 然后我发现了这篇文章: 将paramiko作为通过ssh移动文件的SSHclient候选者 然后,我用python编写了这个calss包装器,用于我的无服务器处理程序文件:Python 3.x 原因:无法导入模块';处理程序';:没有名为';帕拉米科;?,python-3.x,amazon-web-services,aws-lambda,serverless,Python 3.x,Amazon Web Services,Aws Lambda,Serverless,我需要将带有aws lambda的文件从SFTP服务器移动到我的aws帐户, 然后我发现了这篇文章: 将paramiko作为通过ssh移动文件的SSHclient候选者 然后,我用python编写了这个calss包装器,用于我的无服务器处理程序文件: import paramiko import sys class FTPClient(object): def __init__(self, hostname, username, password): """
import paramiko
import sys
class FTPClient(object):
def __init__(self, hostname, username, password):
"""
creates ftp connection
Args:
hostname (string): endpoint of the ftp server
username (string): username for logging in on the ftp server
password (string): password for logging in on the ftp server
"""
try:
self._host = hostname
self._port = 22
#lets you save results of the download into a log file.
#paramiko.util.log_to_file("path/to/log/file.txt")
self._sftpTransport = paramiko.Transport((self._host, self._port))
self._sftpTransport.connect(username=username, password=password)
self._sftp = paramiko.SFTPClient.from_transport(self._sftpTransport)
except:
print ("Unexpected error" , sys.exc_info())
raise
def get(self, sftpPath):
"""
creates ftp connection
Args:
sftpPath = "path/to/file/on/sftp/to/be/downloaded"
"""
localPath="/tmp/temp-download.txt"
self._sftp.get(sftpPath, localPath)
self._sftp.close()
tmpfile = open(localPath, 'r')
return tmpfile.read()
def close(self):
self._sftpTransport.close()
在我的本地机器上,它按预期工作(test.py):
但当我使用serverless部署它并运行handler.py函数(与上面的test.py相同)时,我返回了错误:
Unable to import module 'handler': No module named 'paramiko'
看起来部署无法导入paramiko(根据上面的文章,它似乎应该适用于AWS上的lambda python 3),不是吗
如果不是的话,这个案例的最佳实践是什么?我是否应该将库包含到本地项目中并将其打包/部署到aws?您必须提供所有未安装在aws Python运行时中的依赖项 查看本教程中的步骤7。看起来他正在将虚拟环境中的依赖项添加到zip文件中。因此,我假设您的ZIP文件包含以下内容:
- 您的worker\u function.py位于顶层
- 包含安装在虚拟环境中的文件的文件夹paramico
请让我知道这是否有帮助。一个全面的指南教程位于: 使用无服务器python需求包 作为无服务器节点插件
在AWS lambda上部署之前,需要创建虚拟环境和Docker Deamon来打包您的无服务器项目您必须创建虚拟环境,安装依赖项,然后压缩站点包下的所有文件
sudo pip install virtualenv
virtualenv -p python3 myvirtualenv
source myvirtualenv/bin/activate
pip install paramiko
cp handler.py myvirtualenv/lib/python
zip -r myvirtualenv/lib/python3.6/site-packages/ -O package.zip
然后在您使用的情况下,将package.zip上传到lambda
custom:
pythonRequirements:
zip: true
在serverless.yml中,必须在处理程序的开头使用此代码段
try:
import unzip_requirements
except ImportError:
pass
Lambda中不包括我上次看到paramiko时可能在中找到的所有详细信息。有关可用软件包的列表,请参阅此链接:gist.github.com/gene1wood/4a052f39490fae00e0c3。此外,步骤#5表示您需要创建一个virtualenv,打包所有依赖项(包括paramiko)并将其上载到lambda函数。我喜欢这个示例,它只需要一些关于用例和机器的更多信息。对我来说,我使用macOS Catalina 10.15.7,命令如下:
zip-r package.zip/Users/me/.local/share/virtualenvs/lambda-dGk8CRLc/lib/python3.8/site packages/
try:
import unzip_requirements
except ImportError:
pass