You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:default runtime可能导致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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:42:47