Configure Poetry to use a virtualenv
TL;DR: If you want to configure Poetry to use a local virtualenv (e.g. .venv/) instead of storing the virtualenv in the cache, first you must set virtualenvs.in-project = true, second you must then re-create the virtualenv with poetry env remove <...> and poetry install.
Problem §
I have an existing Poetry project. By default, Poetry has created the virtualenv in C:\Users\squirrel\AppData\Local\pypoetry\Cache\virtualenvs\, but I want to switch this to a local .venv/ directory in the project.
Solution §
For those in a hurry, the solution is:
- Configure Poetry to use a local
.venv/with:poetry config virtualenvs.in-project true --local - List the existing virtualenvs:
poetry env info -p - Delete the virtualenv that you are converting to local:
poetry env remove <...> - Re-create the virtualenv:
poetry install
There should now be a .venv/ for your Poetry project in the local directory.
Details §
Get location of Poetry virtualenv §
First, let’s query the current location of the Poetry virtualenv for this project.
We can use poetry show -v:
PS C:\projects\my_project> poetry show -v
Using virtualenv: C:\Users\squirrel\AppData\Local\pypoetry\Cache\virtualenvs\my-project-_dCQaCL2-py3.12
structlog 24.4.0 Structured Logging for PythonOr we can use poetry env info -p:
PS C:\projects\my_project> poetry env info -p
C:\Users\squirrel\AppData\Local\pypoetry\Cache\virtualenvs\my-project-_dCQaCL2-py3.12Additionally, we can list all the Poetry config with poetry config --list and see the default cache-dir location:
PS C:\projects\my_project> poetry config --list
cache-dir = "C:\\Users\\squirrel\\AppData\\Local\\pypoetry\\Cache"
experimental.system-git-client = false
installer.max-workers = null
installer.modern-installation = true
installer.no-binary = null
installer.parallel = true
keyring.enabled = true
solver.lazy-wheel = true
virtualenvs.create = true
virtualenvs.in-project = null
virtualenvs.options.always-copy = false
virtualenvs.options.no-pip = false
virtualenvs.options.no-setuptools = false
virtualenvs.options.system-site-packages = false
virtualenvs.path = "{cache-dir}\\virtualenvs" # C:\Users\squirrel\AppData\Local\pypoetry\Cache\virtualenvs
virtualenvs.prefer-active-python = false
virtualenvs.prompt = "{project_name}-py{python_version}"
warnings.export = trueThis also shows that virtualenvs.in-project is currently not set.
Configure Poetry to use local virtualenv §
We can use virtualenvs.in-project to tell Poetry to create the virtualenv in a local .venv/ directory rather than in cache-dir:
PS C:\projects\my_project> poetry config virtualenvs.in-project true --localThis creates a poetry.toml file (if one did not already exist) with the following:
PS C:\projects\my_project> cat poetry.toml
[virtualenvs]
in-project = truePoetry will use the configuration in the local poetry.toml for all future Poetry commands in that project.
Checking whether it worked §
If we run poetry show -v and poetry env info -p again, we see that the cache location is still in use:
PS C:\projects\my_project> poetry show -v
Using virtualenv: C:\Users\squirrel\AppData\Local\pypoetry\Cache\virtualenvs\my-project-_dCQaCL2-py3.12
structlog 24.4.0 Structured Logging for Python
PS C:\projects\my_project> poetry env info -p
C:\Users\squirrel\AppData\Local\pypoetry\Cache\virtualenvs\my-project-_dCQaCL2-py3.12We can run poetry config --list again to verify that virtualenvs.in-project was set to true:
PS C:\projects\my_project> poetry config --list
cache-dir = "C:\\Users\\squirrel\\AppData\\Local\\pypoetry\\Cache"
experimental.system-git-client = false
installer.max-workers = null
installer.modern-installation = true
installer.no-binary = null
installer.parallel = true
keyring.enabled = true
solver.lazy-wheel = true
virtualenvs.create = true
virtualenvs.in-project = true
virtualenvs.options.always-copy = false
virtualenvs.options.no-pip = false
virtualenvs.options.no-setuptools = false
virtualenvs.options.system-site-packages = false
virtualenvs.path = "{cache-dir}\\virtualenvs" # C:\Users\squirrel\AppData\Local\pypoetry\Cache\virtualenvs
virtualenvs.prefer-active-python = false
virtualenvs.prompt = "{project_name}-py{python_version}"
warnings.export = trueIt is true, yet Poetry is still using the cache virtualenv rather than a local one. So what gives?
We can try to reinstall:
PS C:\projects\my_project> poetry install
Installing dependencies from lock file
No dependencies to install or update
Installing the current project: my-project (0.1.0)But that does not help either.
Delete and re-create the Poetry virtualenv §
The solution is to delete and re-create the virtualenv.
Even though we have set virtualenvs.in-project to true, this change in setting will not do anything if a virtualenv already exists.
First, we can list the virtualenvs:
PS C:\projects\my_project> poetry env info -p
C:\Users\squirrel\AppData\Local\pypoetry\Cache\virtualenvs\my-project-_dCQaCL2-py3.12Since we only have one, we can delete it with poetry env remove --all:
PS C:\projects\my_project> poetry env remove --all
Deleted virtualenv: C:\Users\squirrel\AppData\Local\pypoetry\Cache\virtualenvs\my-project-_dCQaCL2-py3.12Now if we query poetry env info -p, we can see there is no longer a virtualenv:
PS C:\projects\my_project> poetry env info -pSo if we run poetry install, it will now create a new virtualenv at .venv/ as we desired:
PS C:\projects\my_project> poetry install
Creating virtualenv my-project in C:\projects\my_project\.venv
Installing dependencies from lock file
Package operations: 1 install, 0 updates, 0 removals
- Installing structlog (24.4.0)
Installing the current project: my-project (0.1.0)Finally, just to be sure, we can query poetry env info -p again:
PS C:\projects\my_project> poetry env info -p
C:\projects\my_project\.venvAll good.