为何Poetry虚拟环境使用系统Python而非Pyenv指定版本?
我太懂你这种被MacOS自带Python 2.7坑到的感觉了——明明用Pyenv把全局、本地版本都设成了3.8.1,Poetry却非要揪着旧版本不放。下面给你几个实打实的解决步骤:
1. 先确认Pyenv的环境变量加载正常
这是很多人忽略的关键一步:如果Pyenv没在终端会话里正确初始化,你设置的pyenv local其实只是“表面生效”。检查你的shell配置文件(比如~/.zshrc或~/.bash_profile)里有没有这行:
eval "$(pyenv init -)"
如果没有,加上之后重启终端,再执行pyenv version确认版本是3.8.1。只有Pyenv的环境变量加载完整,Poetry才能读到你指定的Python版本。
2. 手动让Poetry关联Pyenv的Python版本
如果已经创建了项目,或者Poetry还是不认Pyenv的版本,直接用poetry env use命令指定具体的Python路径:
poetry env use $(pyenv which python3.8)
执行完这个命令后,进入项目目录跑一下poetry run python --version,就能看到Python版本变成3.8.1了。
3. 新建项目时一步到位用对版本
要是想创建新项目,别着急直接poetry new,先进入目标文件夹锁定Pyenv版本:
cd /path/to/your/project/folder pyenv local 3.8.1 poetry new my-project
这样生成的pyproject.toml里,Python依赖会自动设为^3.8,再也不会出现2.7的情况。
4. 修复已存在的“错版”项目
如果已经有了用错版本的项目,先修改pyproject.toml里的依赖配置:
[tool.poetry.dependencies] python = "^3.8"
然后执行poetry env use $(pyenv which python3.8)指定版本,最后重新安装依赖:
poetry install
就能解决那个烦人的NoCompatiblePythonVersionFound错误了。
至于要不要为项目创建专属Pyenv环境?其实没必要——Pyenv的local设置已经能为当前目录锁定版本,之前执行pyenv local没生效,大概率是因为Pyenv环境变量没加载,或者Poetry没主动读取当前shell的Python版本,所以需要手动用env use推它一把。
内容的提问来源于stack exchange,提问作者P4nd4b0b3r1n0

