背景
腾讯云云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码, 是实时文件处理和数据处理等场景下理想的计算平台。 您只需使用 SCF 平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。
云函数(SCF)各个运行时已内置部分常用依赖库,可是我们使用的时候总是会依赖一些额外的第三方包,这种情况就需要自己安装并上传了。安装依赖包大部分情况下按照官方文档:https://cloud.tencent.com/document/product/583/47561#python是没有任何问题的,可是有些情况会存在native的so文件abi的问题,比如安装Python依赖库dlib的时候。
问题排查原因及解决方案
按照官方文档执行依赖包安装命令:
代码语言:javascript复制$ docker run -it --network=host -v /path/to/your-project:/tmp/your-project python:3.6.1
/bin/bash -c 'cd /tmp/your-project
&& pip install boost
&& pip install cmake
&& pip install dlib -t .'
然后上传在云函数控制台页面上传代码及打包后的依赖:
编写测试代码,这里不做任何逻辑,直接引入dlib
代码语言:javascript复制# -*- coding: utf8 -*-
import json
import requests
import sys
import os
import dlib
# sys.path.append('/tmp')
# from mergeface import cv2
# print(os.system('ls'))
# os.system('pwd')
def main_handler(event, context):
print("Received event: " json.dumps(event, indent = 2))
print("Received context: " str(context))
print("Hello world223")
return("test dlib")
点击测试,直接报错了,初始化超时但是没有报任何异常信息:
原因分析
可能是native的so文件abi的问题,依赖安装文档有这样的说明:
由于本机的mac系统打的包,所以可能存在问题。
解决方案/最佳实践
构建一个centos7和Python3.6的环境重新安装依赖包即可,参考dockerfile如下:
代码语言:javascript复制FROM centos:centos7
WORKDIR /${your_path}
USER root
RUN
RUN yum install -y wget
&& wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
&& yum -y install zlib-devel openssl-devel libffi-devel gcc make
&& tar -xf /${your_path}/Python-3.6.1.tar.xz
&& rm -rf /${your_path}/Python-3.6.1.tar.xz
&& cd /${your_path}/Python-3.6.1/
&& ./configure
&& make
&& make install
&& pip3 install --upgrade pip
&& pip install boost
&& pip install cmake
&& rm -rf /${your_path}/Python-3.6.1/
然后基于该docker镜像重新打包安装依赖即可。