为什么我得到:无法导入模块 'handler':没有名为 'paramiko' 的模块?
Why am I getting : Unable to import module 'handler': No module named 'paramiko'?
我需要使用 aws-lambda 将文件从 SFTP 服务器移动到我的 AWS 账户,
然后我找到了这篇文章:
https://aws.amazon.com/blogs/compute/scheduling-ssh-jobs-using-aws-lambda/
谈论 paramiko 作为 SSH 客户端候选人以通过 ssh 移动文件。
然后我在 python 中编写了这个 calss 包装器,以便从我的无服务器处理程序文件中使用:
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):
import ftp_client
sftp = ftp_client.FTPClient(
"host",
"myuser",
"password")
file = sftp.get('/testFile.txt')
print(file)
但是当我使用无服务器和 运行 handler.py 函数(与上面的 test.py 相同)部署它时,我得到了错误:
Unable to import module 'handler': No module named 'paramiko'
看起来部署无法导入 paramiko(根据上面的文章,它似乎应该可用于 AWS 上的 lambda python 3),不是吗?
如果不是,这种情况的最佳做法是什么?我是否应该将该库包含到我的本地项目中,然后 package/deploy 它到 aws?
您必须提供 AWS 的 Python 运行时中未安装的所有依赖项。
查看教程中的步骤 7。看起来他正在将虚拟环境中的依赖项添加到 zip 文件中。所以我假设您的 ZIP 文件包含以下内容:
- 你的worker_function.py在顶层
- 一个文件夹paramico,其中包含安装在虚拟环境中的文件
如果有帮助请告诉我。
全面的指南教程位于:
https://serverless.com/blog/serverless-python-packaging/
使用无服务器-python-需求包
作为无服务器节点插件。
创建虚拟环境和 Docker 在 AWS lambda 上部署之前需要 Deamon 打包您的无服务器项目
您必须创建一个 virtualenv,安装依赖项,然后将所有文件压缩到 sites-packages/
下
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
中找到所有详细信息
我尝试了各种博客和指南,例如:
花费数小时尝试事物。面临 that or being unable to import 等 SIZE 问题
..我快要结束了(即在本地调用我的处理程序函数),但是即使我的函数已完全正确部署并且甚至在本地调用时没有问题,也无法调用它在 AWS 上。
目前最全面、最好的指南或实际有效的示例是@koalaok 提到的上述内容!谢谢老哥!
实际link
我需要使用 aws-lambda 将文件从 SFTP 服务器移动到我的 AWS 账户, 然后我找到了这篇文章:
https://aws.amazon.com/blogs/compute/scheduling-ssh-jobs-using-aws-lambda/
谈论 paramiko 作为 SSH 客户端候选人以通过 ssh 移动文件。
然后我在 python 中编写了这个 calss 包装器,以便从我的无服务器处理程序文件中使用:
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):
import ftp_client
sftp = ftp_client.FTPClient(
"host",
"myuser",
"password")
file = sftp.get('/testFile.txt')
print(file)
但是当我使用无服务器和 运行 handler.py 函数(与上面的 test.py 相同)部署它时,我得到了错误:
Unable to import module 'handler': No module named 'paramiko'
看起来部署无法导入 paramiko(根据上面的文章,它似乎应该可用于 AWS 上的 lambda python 3),不是吗?
如果不是,这种情况的最佳做法是什么?我是否应该将该库包含到我的本地项目中,然后 package/deploy 它到 aws?
您必须提供 AWS 的 Python 运行时中未安装的所有依赖项。
查看教程中的步骤 7。看起来他正在将虚拟环境中的依赖项添加到 zip 文件中。所以我假设您的 ZIP 文件包含以下内容:
- 你的worker_function.py在顶层
- 一个文件夹paramico,其中包含安装在虚拟环境中的文件
如果有帮助请告诉我。
全面的指南教程位于:
https://serverless.com/blog/serverless-python-packaging/
使用无服务器-python-需求包 作为无服务器节点插件。
创建虚拟环境和 Docker 在 AWS lambda 上部署之前需要 Deamon 打包您的无服务器项目
您必须创建一个 virtualenv,安装依赖项,然后将所有文件压缩到 sites-packages/
下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
中找到所有详细信息
我尝试了各种博客和指南,例如:
花费数小时尝试事物。面临 that or being unable to import
..我快要结束了(即在本地调用我的处理程序函数),但是即使我的函数已完全正确部署并且甚至在本地调用时没有问题,也无法调用它在 AWS 上。
目前最全面、最好的指南或实际有效的示例是@koalaok 提到的上述内容!谢谢老哥!
实际link