Digital Ocean Python函数导入psycopg2模块失败求助
问题:Digital Ocean Function部署Python函数时psycopg2导入失败
尝试将Python函数部署为Digital Ocean Function,部署流程无报错,但调用函数时返回could not import module...错误,具体是psycopg2模块无法导入。相关代码与配置如下:
函数代码
import os import psycopg2 def get_db_connection(): connection = psycopg2.connect( host=os.environ.get("DB_HOST"), port=os.environ.get("DB_PORT"), dbname=os.environ.get("DB_NAME"), user=os.environ.get("DB_USER"), password=os.environ.get("DB_PASSWORD"), ) return connection def main(args): try: version = psycopg2.__version__ conn = get_db_connection() cursor = conn.cursor() cursor.execute("SELECT version();") db_version = cursor.fetchone() cursor.close() conn.close() return { "body": { "message": f"Successfully imported dependencies and found DB version {db_version}.", "psycopg2_version": version } } except Exception as e: return { "body": { "error": f"{str(e)}" }, "statusCode": 500 } if __name__ == "__main__": main([])
项目配置
Project.yml
packages: - name: test-functions actions: - name: tester runtime: 'python:default'
requirements.txt
psycopg2==2.9.10
build.sh
#!/bin/bash set -e virtualenv --without-pip virtualenv source virtualenv/bin/activate pip install -r requirements.txt --target virtualenv/lib/python_3.9/site-packages
部署命令
$ doctl auth init -t <access token from DO App Platform dashboard> $ doctl sls namespace create --label "tests" --region "west" $ doctl sls connect $ doctl sls deploy tests
调用错误
$ doctl sls functions invoke test-functions/tester { "error": "could not import module..." }
原因分析
- psycopg2是依赖系统库的C扩展模块,Digital Ocean Functions构建环境默认缺少
libpq-dev等编译依赖,直接安装会导致编译失败或生成的包无法在运行环境加载 - build.sh中指定的安装路径不符合Digital Ocean Functions的依赖查找规则,运行时无法定位到已安装的psycopg2模块
- 使用
python:defaultruntime可能导致Python版本不匹配,本地编译的包与运行环境版本冲突
解决方法
1. 改用预编译的psycopg2-binary
psycopg2-binary是预编译的二进制包,无需在构建环境编译,规避系统依赖问题:
修改requirements.txt:
psycopg2-binary==2.9.10
2. 调整依赖安装路径
Digital Ocean Functions会从函数目录下的.python_packages/lib/pythonX.X/site-packages加载依赖,修改build.sh:
#!/bin/bash set -e # 创建符合DO规范的依赖目录 mkdir -p .python_packages/lib/python3.9/site-packages # 将依赖安装到指定目录 pip install -r requirements.txt --target .python_packages/lib/python3.9/site-packages
注意:根据runtime实际Python版本调整路径中的3.9,例如Python 3.10则改为3.10
3. 指定明确的Python runtime版本
在Project.yml中指定与依赖编译版本匹配的Python版本,避免版本冲突:
packages: - name: test-functions actions: - name: tester runtime: 'python:3.9' # 替换为实际兼容的版本
4. 安装系统依赖(若坚持使用psycopg2)
如果必须使用psycopg2而非psycopg2-binary,需在构建时先安装系统编译依赖,修改build.sh:
#!/bin/bash set -e # 安装编译所需的系统依赖(仅适用于Ubuntu/Debian构建环境) apt-get update && apt-get install -y libpq-dev python3-dev mkdir -p .python_packages/lib/python3.9/site-packages pip install -r requirements.txt --target .python_packages/lib/python3.9/site-packages
5. 查看构建日志定位具体错误
部署时添加--verbose参数查看详细构建日志,确认psycopg2安装是否成功:
doctl sls deploy tests --verbose
内容的提问来源于stack exchange,提问作者j3py
相关产品推荐
相关产品推荐

