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 Python
Or 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 . 12
Additionally, 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 = true
This also shows that virtualenvs.in-project
is currently not set.
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 - -local
This 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 = true
Poetry 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 . 12
We 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 = true
It 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 . 12
Since 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 . 12
Now if we query poetry env info -p
, we can see there is no longer a virtualenv:
PS C: \ projects \ my_project > poetry env info -p
So 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 \. venv
All good.