poetry 找不到 pyenv 安装的 python 是因未生效 shim 路径,需确保 shell 正确初始化 pyenv、执行 pyenv rehash,并用 poetry env use 显式指定版本。

pyenv 安装 Python 版本后,poetry 为什么还是找不到?
因为 poetry 默认不自动感知 pyenv 管理的 Python 解释器,它只认系统 PATH 里“显式可用”的 Python,而 pyenv 是靠 shell hook 动态改 PYTHONPATH 和 PATH 的,poetry 初始化时可能没触发那层逻辑。
- 执行
pyenv global 3.11.9后,先运行pyenv rehash(确保 shims 更新) - 再用
poetry env use 3.11.9显式指定,而不是依赖自动探测 - 如果报错
Command python3.11 not found,说明poetry没读到pyenv的 shim 路径,检查which python3.11是否返回~/.pyenv/shims/python3.11;不是的话,确认 shell 配置(如~/.zshrc)里有export PYENV_ROOT="$HOME/.pyenv"和command -v pyenv >/dev/null && export PATH="$PYENV_ROOT/bin:$PATH"
poetry init / poetry install 时 Python 版本不一致怎么办?
常见于项目已有 pyproject.toml 但 requires-python 写的是 ">=3.9,,而当前 <code>pyenv 激活的是 3.12.1 —— poetry 会拒绝创建环境,哪怕你本地装了兼容版本。
- 先用
pyenv install 3.11.9装一个明确匹配的版本 - 用
pyenv local 3.11.9在项目根目录生成.python-version,让 shell 自动切换 - 再运行
poetry install,它会优先选pyenv local指定的版本,而不是全局或最新版 - 若仍失败,删掉
poetry.lock和__pypackages__(如有),重试;锁文件可能固化了旧解释器哈希
poetry run python 和直接用 pyenv 的 python 有什么区别?
本质是环境隔离层级不同:poetry run python 运行在 poetry 创建的虚拟环境中(路径类似 ~/.cache/pypoetry/virtualenvs/xxx-py3.11),而 pyenv which python 返回的是 pyenv shim 指向的某个已安装 Python 二进制(如 ~/.pyenv/versions/3.11.9/bin/python)。
- 用
poetry run python -c "import sys; print(sys.executable)"可确认实际执行路径 - 如果想临时绕过 poetry 环境,直接调底层 Python,就用
$(pyenv which python) script.py,但这时不会加载poetry里声明的依赖 -
poetry shell启动的子 shell 里,python命令自动指向 poetry 虚拟环境,不是pyenv当前版本 —— 这点容易混淆,尤其调试时
CI/CD 或 Docker 中 pyenv + poetry 组合怎么避免卡住?
pyenv 编译安装 Python 在无交互、无缓存的 CI 环境里极慢,且 poetry 依赖网络拉包,两者叠加容易超时或权限出错。
立即学习“Python免费学习笔记(深入)”;
- CI 中优先用预编译二进制:设置
export PYENV_BUILD_PYTHON_MIRROR=https://mirrors.tuna.tsinghua.edu.cn/pyenv加速下载 - 跳过编译,用
pyenv install --skip-existing 3.11.9(前提是镜像源提供 precompiled binary) - Dockerfile 里不要在构建阶段反复
poetry install,把poetry export -f requirements.txt | pip install -r /dev/stdin作为替代(牺牲 Poetry 锁精度,换构建稳定性) - 关键点:CI runner 必须启用
pyenv init -的 eval 输出,否则poetry根本看不到pyenvPython —— 很多人漏掉这句,只配了PYENV_ROOT










