我为什么得到:无法导入模块“处理程序”:没有名为“ paramiko”的模块?

时间:2018-08-22 15:20:00

标签: python-3.x amazon-web-services aws-lambda serverless

我需要将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)是不是

如果不是这种情况的最佳做法是什么?我应该将库包含在本地项目中,然后打包/部署到AWS吗?

4 个答案:

答案 0 :(得分:1)

如果您使用

custom:
  pythonRequirements:
    zip: true

在serverless.yml中,您必须在处理程序的开头使用此代码段

try:
  import unzip_requirements
except ImportError:
  pass

所有可能的详细信息都可以在Serverless Python Requirements documentation

中找到

答案 1 :(得分:0)

您必须提供未在AWS的Python运行时中安装的所有依赖项。

看看教程中的步骤7 。看起来他正在将虚拟环境的依赖项添加到zip文件中。因此,我假设您的ZIP文件包含以下内容:

  • 您的 worker_function.py 在顶级
  • 一个文件夹 paramico ,其中包含安装在虚拟环境中的文件

请帮助我。

答案 2 :(得分:0)

全面的指南教程位于:

https://serverless.com/blog/serverless-python-packaging/

使用serverless-python-requirements软件包 作为无服务器节点插件。

在部署到AWS lambda上之前,需要创建一个虚拟环境和Docker Deamon打包无服务器项目

答案 3 :(得分:0)

您必须创建一个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