How does the Python tool Poetry know the path of a project's virtual environment?

Viewed 4380

My question: How does the Python tool Poetry know the path of the virtual environment of a project?

Explanation: When I run poetry init inside a directory, a new project is created. Then I run poetry install and a new virtual environment is created. HOWEVER, neither the path nor the hash of that virtual environment are stored in pyproject.toml or poetry.lock as I expected. How does Poetry then know the location of the virtual environment when I run poetry env info -p?

Besides wanting to know what is going on, I need to know this for 2 reasons:

  • How can I move a directory with a Poetry project without breaking the link to its virtual environment?
  • How to know which of Poetry's virtual environments are unused and can thus be deleted?

Possible solution: Looking into the source code of Poetry, it seemed to me that a file envs.toml may include a mapping from filesystem directories to virtual environment hashes, but on my Mac OS 11.1 I can't find such a file.

1 Answers

I dived deeper into the source code and I may have understood it now:

  • The relevant code is at poetry/utils/env.py inside the method EnvManager.generate_env_name(...)
  • The code deduces the location of the environment by using the project name from pyproject.toml and adding the hash of the parent directory of pyproject.toml

As a consequence:

  • There is no simple way to delete environments which are not used anymore
  • Also, if I want to move the directory of a poetry project, I would need to rename the virtual environment's folder and replace the hash correctly. This should work, but it would be preferable to just run poetry install again and create a new virtual environment
Related