In the original Hypermodern Python Blogpost, Poetry was recommended as the preferred tool.
There are quite a lot of packaging tools out there which I do not want to go into in depth, instead I recommend Anna-Lena Popkes An unbiased evaluation of environment management and packaging tools.
What has emerged as the preferred way to store packaging information is the pyproject.toml file.
Using pyproject.toml over setup.py has become a preferred choice for several reasons:
- 
Consistent Configuration: 
pyproject.tomlis part of the PEP 518 and PEP 517 specifications, offering a standardized and consistent way to declare build configurations and dependencies. - 
PEP 518 Support: 
pyproject.tomlsupports PEP 518, allowing the declaration of build system requirements, enabling better compatibility with modern build tools and providing more flexibility in the build process. - 
Modern Tooling: Some modern Python tools rely on 
pyproject.tomlfor project configuration. Adoptingpyproject.tomlaligns with these tools and facilitates a smoother integration with them. - 
Readability and Maintainability: The 
pyproject.tomlformat is often considered more readable and straightforward than the Python code used insetup.py. This can contribute to better maintainability, especially for more complex projects. - 
Standardization: As Python packaging evolves, 
pyproject.tomlis becoming the de facto standard for configuration, supported by tools likepipand build systems likeflitandpoetry. 
The adoption of pyproject.toml aligns with modern best practices in the Python packaging ecosystem.
Converting a setup.py base package to a pyproject.toml based one turns out to be straightforward for most use cases.
While it is easy to write a pyproject.toml there are a number of tools to convert legacy package information into this format.
- 
setuptools-py2cfg A script for converting 
setup.pytosetup.cfg - ini2toml which automatically translates .ini/.cfg files into TOML
 - 
validate-pyproject for automated checks on 
pyproject.tomlpowered by JSON Schema definitions - pyprojectsort enforces consistent formatting of pyproject.toml files, reducing merge request conflicts and saving time otherwise spent on manual formatting.
 - pyroma Rate your Python packages package friendliness.
 
Example
Install the required packages
pip install setuptools-py2cfg ini2toml[full]
or if you get an error no matches found: ini2toml[full]
pip install setuptools-py2cfg ini2toml configupdater tomlkit
Create a temporary cfg file
setuptools-py2cfg > tmp.cfg
and convert it into a toml file:
ini2toml --output-file=tmp.toml --profile=setup.cfg tmp.cfg
Apart from the profile setup.cfg ini2toml also has profiles to convert settings to their pyproject.toml equivalent for
.coveragerc.isort.cfgmypy.ini- 
pytest.ini('ini_options' table) 
After you converted the files, cut and paste them into a new (or existing) pyproject.toml file and validate and format them.
pip install validate-pyproject pyprojectsort pyroma
pyprojectsort
validate-pyproject pyproject.toml
Now you can delete your old setup.py file and verify that your package still builds as expected with
rm setup.py
python -m build
pyroma .
Check the dist/[my-package-name].tar.gz file to ensure it builds like before.
Adjust and tweak the settings as outlined in the user guide



pretty-toml-sort may be an alternative to
pyprojectsort