使用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
相关产品推荐
相关产品推荐

