如何在 AWS Lambda 上安装 Google or-tools?
How to install Google or-tools on AWS Lambda?
我已在 AWS EC2 实例上成功使用 Google's or-tools
,但最近一直在研究将它们包含在 AWS Lambda 函数中,但无法将其添加到 运行。
函数debug.py
下面只是从 ortools
导入 pywrapcp
的基本函数,如果一切设置正确,应该会成功。
from ortools.constraint_solver import pywrapcp
def handler(event, context):
print(pywrapcp)
if __name__ == '__main__':
handler(None, None)
模块导入失败
我创建了一个 package.sh
脚本,它在创建 zip 存档之前将所有依赖项复制到亚马逊 instructions 之后的项目中。 运行 部署的代码结果如下:
Unable to import module 'debug': No module named ortools.constraint_solver
package.sh
的内容
#!/bin/bash
DEST_DIR=$(dirname $(realpath -s [=13=]));
echo "Copy all native libraries...";
mkdir -p ./lib && find $directory -type f -name "*.so" | xargs cp -t ./lib;
echo "Create package...";
zip -r dist.zip debug.py lib;
rm -r ./lib;
echo "Add dependencies from $VIRTUAL_ENV to $DEST_DIR/dist.zip";
cd $VIRTUAL_ENV/lib/python2.7/site-packages;
zip -ur $DEST_DIR/dist.zip ./** -x;
当我将 ortools-4.4.3842-py2.7-linux-x86_64.egg
中的 ortools
文件夹直接复制到项目根目录时,它会找到 ortools
但无法导入 pywrapcp
,这可能与失败有关正在加载本机库,但我不确定,因为日志没有显示太多细节。
Unable to import module 'debug': cannot import name pywrapcp
有什么想法吗?
首先,底层 AWS Lambda 执行环境是 Amazon Linux,而 or-tools 未根据 https://github.com/google/or-tools
在以下环境之外进行测试
- Ubuntu 14.04 和 16.04(64 位)。
- Mac OS X El Capitan 与 Xcode 7.x(64 位)。
- Microsoft Windows Visual Studio 2013 和 2015(64 位)
通过使用 aws lambda 在此处列表中使用的 ami 之一启动实例来测试您的代码 (http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html)
如果可行,请使用 pip 在项目目录的根目录下安装 dependencies/libraries,然后压缩。不要手动将库复制到您的项目目录
在 Google or-tools
上的讨论之后,我整理了一个打包脚本,以适用于 AWS Lambda 的方式解决安装依赖项的问题。
其中的关键部分是必须将 egg 包的内容手动复制到 Lambda 项目文件夹,并为其授予正确的权限,以便在运行时可以访问它们。
#!/bin/sh
easy_install3 py3-ortools
find "/opt/python3/lib/python3.6/site-packages" -path "*.egg/*" -not -name "EGG-INFO" -maxdepth 2 -exec cp -r {} ./dist \;
chmod -R 755 ./dist
您可以使用 Docker 在本地创建可部署包,而不是创建和配置 EC2 实例,有关详细信息,请参阅 or-tools-lambda
。
我已在 AWS EC2 实例上成功使用 Google's or-tools
,但最近一直在研究将它们包含在 AWS Lambda 函数中,但无法将其添加到 运行。
函数debug.py
下面只是从 ortools
导入 pywrapcp
的基本函数,如果一切设置正确,应该会成功。
from ortools.constraint_solver import pywrapcp
def handler(event, context):
print(pywrapcp)
if __name__ == '__main__':
handler(None, None)
模块导入失败
我创建了一个 package.sh
脚本,它在创建 zip 存档之前将所有依赖项复制到亚马逊 instructions 之后的项目中。 运行 部署的代码结果如下:
Unable to import module 'debug': No module named ortools.constraint_solver
package.sh
#!/bin/bash
DEST_DIR=$(dirname $(realpath -s [=13=]));
echo "Copy all native libraries...";
mkdir -p ./lib && find $directory -type f -name "*.so" | xargs cp -t ./lib;
echo "Create package...";
zip -r dist.zip debug.py lib;
rm -r ./lib;
echo "Add dependencies from $VIRTUAL_ENV to $DEST_DIR/dist.zip";
cd $VIRTUAL_ENV/lib/python2.7/site-packages;
zip -ur $DEST_DIR/dist.zip ./** -x;
当我将 ortools-4.4.3842-py2.7-linux-x86_64.egg
中的 ortools
文件夹直接复制到项目根目录时,它会找到 ortools
但无法导入 pywrapcp
,这可能与失败有关正在加载本机库,但我不确定,因为日志没有显示太多细节。
Unable to import module 'debug': cannot import name pywrapcp
有什么想法吗?
首先,底层 AWS Lambda 执行环境是 Amazon Linux,而 or-tools 未根据 https://github.com/google/or-tools
在以下环境之外进行测试- Ubuntu 14.04 和 16.04(64 位)。
- Mac OS X El Capitan 与 Xcode 7.x(64 位)。
- Microsoft Windows Visual Studio 2013 和 2015(64 位)
通过使用 aws lambda 在此处列表中使用的 ami 之一启动实例来测试您的代码 (http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html)
如果可行,请使用 pip 在项目目录的根目录下安装 dependencies/libraries,然后压缩。不要手动将库复制到您的项目目录
在 Google or-tools
上的讨论之后,我整理了一个打包脚本,以适用于 AWS Lambda 的方式解决安装依赖项的问题。
其中的关键部分是必须将 egg 包的内容手动复制到 Lambda 项目文件夹,并为其授予正确的权限,以便在运行时可以访问它们。
#!/bin/sh
easy_install3 py3-ortools
find "/opt/python3/lib/python3.6/site-packages" -path "*.egg/*" -not -name "EGG-INFO" -maxdepth 2 -exec cp -r {} ./dist \;
chmod -R 755 ./dist
您可以使用 Docker 在本地创建可部署包,而不是创建和配置 EC2 实例,有关详细信息,请参阅 or-tools-lambda
。