swirl
Home Software Blog Wallpapers Webtools
Using Poetry to manage your Python projects
Wednesday 26, February 2025   |   Post link

Overview

This post discuss using Poetry which is a powerful and easy-to-use tool for managing dependencies and packaging in Python projects. It simplifies the process of adding, removing, and updating libraries, and keeps project settings and dependencies organized using a single file, pyproject.toml.

Uses of Poetry

  • Managing dependencies: Poetry automatically finds and installs the right versions of libraries, ensuring they work well together. It also removes outdated dependencies and updates them to the latest versions.
  • Creating virtual environments: Poetry creates separate virtual environments for each project, preventing conflicts between libraries.
  • Packaging projecs: Poetry sets up new projects with a basic structure and stores all metadata in the pyproject.toml file. It also makes it easy to publish packages to repositories like PyPI.

Sample application

To demonstrate the use of Poetry, we will do the following:

  1. Install Poetry
  2. Create a new project
  3. Create a virtual environment
  4. Add Flask dependency
  5. Implement a Hello World API endpoint
  6. Test the application
  7. Package the project
  8. Install the package

Step 1: Install Poetry

The Poetry package must be installed before we can start using it. This can be done using the following command:

pip install poetry

To check if Poetry was installed successfully, run:

python -m pip install --upgrade pip

If it is installed, the output will look something like:

Name: poetry
Version: 2.1.1
Summary: Python dependency management and packaging made easy.
Home-page: https://python-poetry.org/
Author: Sébastien Eustace
...

Step 2: Use Poetry to create an empty project

First create a new project folder say 'Sample' and then use Poetry's 'new' command to generate basic project skeleton.

mkdir Sample
poetry new FlaskHello

This will generate a directory with the project name which is 'FlaskHello' in this case and a readme.md file.

We now have the following directory strcture:

Sample/
+- readme.md
+- FlaskHello/
   +- pyproject.toml
   +- README.md
   +- src/
      +- flaskhello/
         +- __init__.py
   +- tests/
  • flaskhello/: Contains an __init__.py file. We can write our Flask code, modules, functions, and other related support components here.
  • pyproject.toml: Contains Project details, Poetry configuration, and installed dependencies.
  • README.md: Place project documentation here.
  • tests: Unit tests should be stored here.

The pyproject.toml file looks like this:

[project]
name = "flaskhello"
version = "0.1.0"
description = ""
authors = [
    {name = "Your Name",email = "you@example.com"}
]
readme = "README.md"
requires-python = ">=3.11"
dependencies = [
]

[tool.poetry]
packages = [{include = "flaskhello", from = "src"}]


[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"

This file should be edited to have the correct author information.

Step 3: Create a virtual environment

Virtual environments are a great way to have project specific Python runtimes with only the packages that the project requires. It is preferable to install packages in virtual environments than install them globally. This reduces the need to deal with conflicting packages all installed in the same place.

The following Poetry command creates a virtual environment:

cd FlaskHello
poetry env use python

When run on Windows, the virtual environment will be created in:

C:\Users\<username>\AppData\Local\pypoetry\Cache\virtualenvs

Use the following command to activate the virtual environment.

poetry env activate

Step 4: Adding dependencies

The 'poetry add <package>' command is used to add a package dependency to the project. Let's first add the dependency for Flask.

poetry add flask

The 'add' command updates the pyproject.toml file with the dependency for flask. If we inspect the file, we see the Flask package listed in the dependency list.

dependencies = [
    "flask (>=3.1.0,<4.0.0)"
]

Similarly, add the dependency for DotEnv.

poetry add dotenv

Step 5: The Hello World API

It is time to implemment the API which returns Hello World. The impementation can be as simple as the following:

# Filename: app.py
import os
from flask import Flask
from dotenv import load_dotenv

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    load_dotenv()    
    app.run(port=os.environ['PORT'])

The file is saved as app.py.

Create an empty text file named .env to hold configurations. The only configuration for this application is the PORT number. Thie file needs to be saved in the same directory as the app.py file.

PORT=5000

Step 6: Test the application

The application can be run from the command line using:

poetry run python src\flaskhello\app.py

The API can be invoked as follows:

curl http://127.0.0.1:5000
Hello, World!

Now that everything is working, the next step is to package the application.

Step 7: Package the project

The 'poetry build' command is used to build a package. Though this application is not a package, let's still build it as a package.

poetry build

The package is built as .whl package. The package files are built and stored in the 'dist' folder.

26-02-2025  14:29    <DIR>          .
26-02-2025  14:29    <DIR>          ..
26-02-2025  14:29             1,459 flaskhello-0.1.0-py3-none-any.whl
26-02-2025  14:29               779 flaskhello-0.1.0.tar.gz
               2 File(s)          2,238 bytes
               2 Dir(s)  857,288,904,704 bytes free

Step 8: Install the package

The next step is to install the flaskhello package. Create a new folder named 'FlaskHelloTest' & create a new virtual environment with in & activate it.

mkdir FlaskHelloTest
python -m venv venv
venv\scripts\activate

Install the flaskhello package. This is done using the pip command:

pip install flaskhello-0.1.0-py3-none-any.whl

Open an interactive Python session & enter the following commands:

python
>>> from flaskhello import flaskhello
>>> flaskhello.hello()
'Hello, World!'

There! we have been able to install the flaskhello package and call the hello() function as if it were a reusable package.




Comments

Posts By Year

2025 (1)
2024 (4)
2023 (5)
2022 (10)
2021 (5)
2020 (12)
2019 (6)
2018 (8)
2017 (11)
2016 (6)
2015 (17)
2014 (2)
2013 (4)
2012 (2)

Posts By Category

.NET (4)
.NET Core (2)
ASP.NET MVC (4)
AWS (5)
AWS API Gateway (1)
Android (1)
Apache Camel (1)
Architecture (1)
Audio (1)
Azure (2)
Book review (3)
Business (1)
C# (3)
C++ (2)
CloudHSM (1)
Containers (4)
Corporate culture (1)
Database (3)
Database migration (1)
Desktop (1)
Docker (1)
DotNet (3)
DotNet Core (2)
ElasticSearch (1)
Entity Framework (3)
Git (3)
IIS (1)
JDBC (1)
Java (10)
Kibana (1)
Kubernetes (1)
Lambda (1)
Learning (1)
Life (7)
Linux (2)
Lucene (1)
Multi-threading (1)
Music (1)
OData (1)
Office (1)
PHP (1)
Photography (1)
PowerShell (2)
Programming (29)
Python (2)
Rants (5)
SQL (2)
SQL Server (1)
Security (3)
Software (1)
Software Engineering (1)
Software development (2)
Solr (1)
Sql Server (2)
Storage (1)
T-SQL (1)
TDD (1)
TSQL (5)
Tablet (1)
Technology (1)
Test Driven (1)
Testing (1)
Tomcat (1)
Unit Testing (1)
Unit Tests (1)
Utilities (3)
VC++ (1)
VMWare (1)
VSCode (1)
Visual Studio (2)
Wallpapers (1)
Web API (2)
Win32 (1)
Windows (9)
XML (2)

Posts By Tags

.NET(6) API Gateway(1) ASP.NET(4) AWS(3) Adults(1) Advertising(1) Android(1) Anti-forgery(1) Asynch(1) Authentication(2) Azure(2) Backup(1) Beliefs(1) BlockingQueue(1) Book review(2) Books(1) Busy(1) C#(4) C++(3) CLR(1) CORS(1) CSRF(1) CTE(1) Callbacks(1) Camel(1) Certificates(1) Checkbox(1) Client authentication(1) CloudHSM(1) Cmdlet(1) Company culture(1) Complexity(1) Consumer(1) Consumerism(1) Containers(3) Core(2) Custom(2) DPI(1) Data-time(1) Database(4) Debugging(1) Delegates(1) Developer(2) Dockers(2) DotNetCore(3) EF 1.0(1) Earphones(1) Elastic Search(2) ElasticSearch(1) Encrypted(1) Entity framework(1) Events(1) File copy(1) File history(1) Font(1) Git(2) HierarchyID(1) Hyper-V(1) IIS(1) Installing(1) Intelli J(1) JDBC(1) JSON(1) JUnit(1) JWT(1) Java(3) JavaScript(1) Kubernetes(1) Life(1) LinkedIn(1) Linux(2) Localization(1) Log4J(1) Log4J2(1) Logging(1) Lucene(1) MVC(4) Management(2) Migration history(1) Mirror(1) Mobile Apps(1) Modern Life(1) Money(1) Music(1) NGINX(1) NTFS(1) NUnit(2) OData(1) OPENXML(1) Objects(1) Office(1) OpenCover(1) Organization(1) PHP(1) Paths(1) Poetry(1) PowerShell(2) Processes(1) Producer(1) Programming(2) Python(3) QAAC(1) Quality(1) REDIS(2) REST(1) Runtimes(1) S3-Select(1) SD card(1) SLF4J(1) SQL(2) SQL Code-first Migration(1) SSH(2) SSL(1) Sattelite assemblies(1) School(1) Secrets Manager(1) Self reliance(1) Service(1) Shell(1) Solr(1) Sony VAIO(1) Spirituality(1) Spring(1) Sql Express(1) System Image(1) TDD(1) TSQL(3) Table variables(1) Tables(1) Tablet(1) Ubuntu(1) Url rewrite(1) VMWare(1) VSCode(1) Validation(2) VeraCode(1) Wallpaper(1) Wallpapers(1) Web Development(4) Windows(2) Windows 10(2) Windows 2016(2) Windows 8.1(1) Work culture(1) XML(1) Yii(1) iTunes(1) open file handles(1) renew(1) security(1) static ip address(1) ulimit(1)