我个人使用的方式非常有效:
使用pyenv管理Python版本,以及它的插件pyenv-virtualenv来管理这些版本作为虚拟环境,然后使用Poetry来自动从中选择版本并管理依赖项:
使用pyenv安装你想要使用的Python版本:
pyenv install -v 3.7
基于已安装的3.7版本创建虚拟环境。
您需要使用pyenv-virtualenv插件。
pyenv virtualenv 3.7 arshbot_3.7_virtualenv
假设有一个名为arshbot_proj的项目。在$HOME目录中工作:
mkdir ~/arshbot_proj
cd ~/arshbot_proj
使用刚创建的虚拟环境。将此项目附加到它上面。
下面创建一个 .python-version 文件,指示 arshbot_3.7_virtualenv。
pyenv local arshbot_3.7_virtualenv
使用poetry init命令在目录中创建pyproject.toml文件,使用arshbot_3.7_virtualenv虚拟环境。
你也可以使用poetry new代替poetry init来创建项目结构,同时在pyproject.toml旁边创建项目,而不是在以上步骤中先创建项目。
当这个目录里有pyproject.toml和.python-version两个文件时,Poetry将自动选择使用arshbot_3.7_virtualenv,Python版本为3.7。
Poetry还将使用此虚拟环境在~/.pyenv/versions/3.7/envs/arshbot_3.7_virtualenv/lib/python3.7/site-packages安装软件包。
poetry init
就是这样。每次在激活的虚拟环境中从该目录运行Poetry时,它都会自动选择3.7版本。对于不同的Python版本,只需重复上述步骤,将3.7替换为新版本即可。
虚拟环境将出现两次:作为虚拟环境的envs目录中,也作为版本的versions目录中,当Poetry安装包时,其内容会被复制。
BONUS:
我们尝试使用不同的方法来使其更加清晰,概念相同,结果相同。
由于默认情况下,如果您没有更改PYENV_ROOT,则pyenv会在~/.pyenv/versions中安装每个Python版本:
如果您希望系统版本(随您的发行版一起提供)成为您可以选择的版本之一,请使用venv模仿pyenv安装Python版本,现在将其称为system_ver,以代替3.7。由于它已经存在于系统中,我们不需要pyenv下载它,我们将其复制到我们的versions目录中,以便创建虚拟环境时可用。
cd ~/.pyenv/versions
python3 -m venv --copies system system_ver
pyenv virtualenv system_ver system_ver_virtualenv
如果想在您的项目中使用它来替代之前的版本3.7:
cd ~/arshbot_proj
pyenv local system_ver_virtualenv
Poetry 现在将使用您发行版最初附带的任何版本。--copies 将确保 venv 复制文件而不是使用链接,因此您可以省略它。如果您需要稍后使用虚拟环境中的文件创建项目的多阶段 Dockerfile,则通常很有用。
poetry new poetry-demo
,而不是3。 - Thomas