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 3.x 原因:无法导入模块';处理程序';:没有名为';帕拉米科;?_Python 3.x_Amazon Web Services_Aws Lambda_Serverless - Fatal编程技术网

Python 3.x 原因:无法导入模块';处理程序';:没有名为';帕拉米科;?

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): """

我需要将带有aws lambda的文件从SFTP服务器移动到我的aws帐户, 然后我发现了这篇文章:

将paramiko作为通过ssh移动文件的SSHclient候选者

然后,我用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):

但当我使用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