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

使用Testcontainers-postgres时出现psycopg2模块未找到错误

问题:Pants测试时提示psycopg2模块找不到

在使用Pants执行pants test ::运行测试时,触发以下错误:

engine = create_engine(DATABASE_URL)
/home/runner/.cache/pants/named_caches/pex_root/venvs/s/c7e9f9b3/venv/lib/python3.11/site-packages/sqlalchemy/util/deprecations.py:281: in warned
    return fn(*args, **kwargs)  # type: ignore[no-any-return]
/home/runner/.cache/pants/named_caches/pex_root/venvs/s/c7e9f9b3/venv/lib/python3.11/site-packages/sqlalchemy/engine/create.py:599: in create_engine
    dbapi = dbapi_meth(**dbapi_args)
/home/runner/.cache/pants/named_caches/pex_root/venvs/s/c7e9f9b3/venv/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py:690: in import_dbapi
    import psycopg2
E   ModuleNotFoundError: No module named 'psycopg2'

尽管psycopg2已包含在Poetry的pyproject.toml和.lock文件中,甚至在CI工作流中手动执行pip install psycopg2后,错误依然存在。


解决方案

1. 让Pants正确识别psycopg2依赖

Pants作为独立构建系统,不会自动读取Poetry的依赖配置,需要单独声明:

  • 在项目根目录创建或更新requirements.txt,添加:
    psycopg2-binary==2.9.9  # 推荐用预编译版本,避免编译依赖问题
    
  • 或者在项目的BUILD文件中用Pants规则声明依赖:
    python_requirement_library(
        name="psycopg2",
        requirements=["psycopg2-binary==2.9.9"],
    )
    
    # 在测试目标中添加该依赖
    python_test(
        name="tests",
        sources=["tests/**/*.py"],
        dependencies=[
            ":psycopg2",
            # 其他项目依赖...
        ],
    )
    

2. 替换为psycopg2-binary

psycopg2需要编译环境(如libpq-dev),CI环境往往缺少这些依赖,改用预编译的psycopg2-binary更稳妥:

  • 修改pyproject.toml:
    [tool.poetry.dependencies]
    # 替换原psycopg2条目
    psycopg2-binary = "^2.9.9"
    
  • 更新Poetry锁文件:
    poetry lock --no-update
    

3. CI中让Pants管理依赖,避免手动pip安装

在Github Actions工作流中,不要手动执行pip install,而是让Pants自动处理依赖:

  • 添加步骤导出Poetry依赖为Pants可识别的格式:
    - name: Export Poetry dependencies
      run: poetry export --format=requirements.txt --output=requirements.txt --without-hashes
    - name: Run tests with Pants
      run: pants test ::
    

4. 确保Pants与Poetry使用相同Python版本

在pants.toml中配置与Poetry一致的Python版本约束:

[python]
interpreter_constraints = ["==3.11.*"]

内容的提问来源于stack exchange,提问作者Asad Amir Khwaja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:03:30