How to use Poetry to manage your Python projects on Fedora

Python & Poetry on Fedora

Python developers often create a new virtual environment to separate project dependencies and then manage them with tools such as pip, pipenv, etc. Poetry is a tool for simplifying dependency management and packaging in Python. This post will show you how to use Poetry to manage your Python projects on Fedora.

Unlike other tools, Poetry uses only a single configuration file for dependency management, packaging, and publishing. This eliminates the need for different files such as Pipfile, MANIFEST.in, setup.py, etc. It is also faster than using multiple tools.

Detailed below is a brief overview of commands used when getting started with Poetry.

Installing Poetry on Fedora

If you already use Fedora 32 or above, you can install Poetry directly from the command line using this command:

$ sudo dnf install poetry

Editor note: on Fedora Silverblue or CoreOs Python 3.9.2 is part of the core commit, you would layer Poetry with ‘rpm-ostree install poetry

Initialize a project

Create a new project using the new command.

$ poetry new poetry-project

The structure of a project created with Poetry looks like this:

 ├── poetry_project
 │   └── init.py
 ├── pyproject.toml
 ├── README.rst
 └── tests
     ├── init.py
     └── test_poetry_project.py

Poetry uses pyproject.toml to manage the dependencies of your project. Initially, this file will look similar to this:

[tool.poetry]
name = "poetry-project"
version = "0.1.0"
description = ""
authors = ["Someone <someone@somemail.com>"]

[tool.poetry.dependencies]
python = "^3.9"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

This file contains 4 sections:

  • The first section contains information describing the project such as project name, project version, etc.
  • The second section contains project dependencies. These dependencies are necessary to build the project.
  • The third section contains development dependencies.
  • The fourth section describes a building system as in PEP 517

If you already have a project, or create your own project folder, and you want to use poetry, run the init command within your project.

$ poetry init

After this command, you will see an interactive shell to configure your project.

Create a virtual environment

If you want to create a virtual environment or activate an existing virtual environment, use the command below:

$ poetry shell

Poetry creates the virtual environment in the /home/username/.cache/pypoetry project by default. You can change the default path by editing the poetry config. Use the command below to see the config list:

$ poetry config --list

cache-dir = "/home/username/.cache/pypoetry" 
virtualenvs.create = true 
virtualenvs.in-project = true 
virtualenvs.path = "{cache-dir}/virtualenvs"

Change the virtualenvs.in-project configuration variable to create a virtual environment within your project directory. The Poetry command is:

$ poetry config virtualenvs.in-project true

Add dependencies

Install a dependency for the project with the poetry add command.

$ poetry add django

You can identify any dependencies that you use only for the development environment using the add command with the –dev option.

$ poetry add black --dev

The add command creates a poetry.lock file that is used to track package versions. If the poetry.lock file doesn’t exist, the latest versions of all dependencies in pyproject.toml are installed. If poetry.lock does exist, Poetry uses the exact versions listed in the file to ensure that the package versions are consistent for everyone working on your project.

Use the poetry install command to install all dependencies in your current project.

$ poetry install

Prevent development dependencies from being installed by using the no-dev option.

$ poetry install --no-dev

List packages

The show command lists all of the available packages. The tree option will list packages as a tree.

$ poetry show --tree

django 3.1.7 A high-level Python Web framework that encourages rapid development and clean, pragmatic design. 
├── asgiref >=3.2.10,<4 
├── pytz * 
└── sqlparse >=0.2.2 
 

Include the package name to list details of a specific package.

$ poetry show requests

name         : requests 
version      : 2.25.1 
description  : Python HTTP for Humans. 
 
dependencies 
 - certifi >=2017.4.17 
 - chardet >=3.0.2,<5 
 - idna >=2.5,<3 
 - urllib3 >=1.21.1,<1.27

Finally, if you want to learn the latest version of the packages, you can pass the latest option.

$ poetry show --latest

idna     2.10      3.1    Internationalized Domain Names in Applications 
asgiref  3.3.1     3.3.1  ASGI specs, helper code, and adapters

Further information

More details on Poetry are available in the documentation.

Fedora Project community For Developers

9 Comments

  1. Artur

    Small tip: you can use dephell (https://dephell.readthedocs.io/) to change from other formats like requirements.txt or Pipfile to poetry.

    Install dephell, add below to pyproject.toml and run “dephell deps convert”.

    [tool.dephell.main]
    from = {format = “pip”, path = “requirements.txt”}
    to = {format = “poetry”, path = “pyproject.toml”}

    • Ryan

      This is nifty!

      Poetry does have the ability to export a requirements.txt file natively(poetry export -f requirements.txt), if this is all that is desired.

  2. Katsuharu Tanaka

    Thank you for introducing a useful tool. I will try it in a future project.

  3. Nice write up… Will try this out soon

  4. Tim Hughes

    Nice and clearly explained. It may also be worth doing a followup on this article to include building as a wheel and publishing to pypi as a project.

    I use poetry for all my new projects so I built a cookiecutter template for it which others may find useful (or not).
    https://github.com/timhughes/cookiecutter-poetry

  5. besiw93427

    Nice.
    Maybe I’ll give this a try.

  6. ojnny

    Thank you! Found a typo here:
    poetry config virtualenv.in-project true
    should be:
    poetry config virtualenvs.in-project true

  7. Ryan

    A shortcut for adding requirements for an existing project is something like:
    poetry add $(cat requirements.txt)

    Has definitely come in handy for us.

  8. Thank you for the nice article, It is a very hand tool as well.

Comments are Closed

The opinions expressed on this website are those of each author, not of the author's employer or of Red Hat. Fedora Magazine aspires to publish all content under a Creative Commons license but may not be able to do so in all cases. You are responsible for ensuring that you have the necessary permission to reuse any work on this site. The Fedora logo is a trademark of Red Hat, Inc. Terms and Conditions