NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #2012 most downloaded on PyPI
A modern Python package and dependency manager supporting the latest PEP standards
Last release 17 days ago
17 Sep 2026
Ships fairly regularly
a new release about every 3 weeks
Nearly every release is documented
notes for 59 of the last 60 stable releases
9 versions withdrawn
withdrawn after publishing
7 years old
254 releases · first in 2020
One column per quarter.
Use a new approach to determine the packages to be installed. This requires a quick resolution step before installation. #456
pdm export no longer produces requirements file applicable for all platforms due to the new approach. #456--no-editable option to install non-editable versions of all packages. #443--no-self option to prevent the project itself from being installed. #444.gitignore file in the __pypackages__ directory. #446PDM_PROJECT_ROOT env var. Change to the project root when executing scripts. #470tomlkit to atoml as the style-preserving TOML parser and writer. #465--dev flag for older versions of PDM. #444Support passing options to the build backends via --config-setting. #452
--config-setting. #452keyring as a dependency and guide users to install it when it is not available. #442distlib. #447Allow pdm use with no argument given, which will list all available pythons for pick. #409
pdm use with no argument given, which will list all available pythons for pick. #409setup.py failed for NameError. #407Make func translate_sections pure to avoid exporting requirements in random order. #401
Deprecate the usage of -d/--dev option in install and sync commands. #391
install and sync commands. Add a new option --prod/--production to exclude them. Improve the dependency selection logic to be more convenient to use — the more common the usage is, the shorter the command is. #391source-includes to mark files to be included only in sdist builds. #390pdm-pep517 to 0.7.0; update resolvelib to 0.7.0. #390-d/--dev option in install and sync commands. #391Improve the env builder to run in isolated mode. #384
pdm run on a directory not initialized yet.resolvelib to 0.6.0. #381pdm.models.readers to improve typing support #321project.python_executable to project.python that contains all info of the interpreter. #382Remove the support of project path following -g/--global that was deprecated in 1.4.0. One should use -g -p for that purpose. #361
:all given to -s/--section to refer to all sections under the same species.
Adjust add, sync, install, remove and update to support the new dev-dependencies groups. Old behavior will be kept the same. #351dev-dependencies is now a table of dependencies groups, where key is the group name and value is an array of dependencies. These dependencies won't appear in the distribution's metadata. dev-dependencies of the old format will turn into dev group under dev-dependencies. #351dev-dependencies, includes, excludes and package-dir out from [project] table to [tool.pdm] table. The migration will be done automatically if old format is detected. #351--dry-run option for update command to display packages that need update, install or removal. Add --top option to limit to top level packages only. #358init command via -n/--non-interactive option. No question will be asked in this mode. #368pdm info, also add an option --packages to show that value only. #372<script>-X.Y variant to the bin folder. #365-g/--global that was deprecated in 1.4.0. One should use -g -p <project_path> for that purpose. #361Skip the first prompt of pdm init #352
Emit warning if version or description can't be retrieved when importing from flit metadata. #342
type argument to pdm cache clear and improve its UI. #343entry-points. #344models.project_info.ProjectInfo, which indexes distlib.metadata._data #335Change the group name of entry points from pdm.plugins to pdm. Export some useful objects and models for shorter import path. #318
pdm.plugins to pdm.
Export some useful objects and models for shorter import path. #318cmd in tools.pdm.scripts configuration items now allows specifying an argument array instead of a string.stream singleton, improve the UI related code. #320cache command, add list, remove and info subcommands. #329pyproject.toml. #308Refactor the code, extract the version related logic from specifiers.py to a separated module. #303
specifiers.py to a separated module. #303setup.py has no install_requires key. #299Support importing dependencies from requirements.txt to dev-dependencies or sections. #291
pdm init fails when pyproject.toml exists but has no [project] section. #295When -I/--ignore-python passed or PDM_IGNORE_SAVED_PYTHON=1, ignore the interpreter set in .pdm.toml and don't save to it afterwards. #283
-I/--ignore-python passed or PDM_IGNORE_SAVED_PYTHON=1, ignore the interpreter set in .pdm.toml and don't save to it afterwards. #283-p/--project is introduced to specify another path for the project base. It can also be combined with -g/--global option.
The latter is changed to a flag only option that does not accept values. #286-f setuppy for pdm export to export the metadata as setup.py #289added documentation on a task provider for vscode #280
Fix the requirement string of a VCS requirement to comply with PEP 508. #275
Abort and tell user the selected section following pdm sync or pdm install is not present in the error message. #274
pdm sync or pdm install is not present in the error message. #274Use the absolute path when importing from a Poetry pyproject.toml. #262
Increase the default value of the max rounds of resolution to 1000, make it configurable. #238
egg-info directory when dependencies change. So that pdm list --graph won't show invalid entries. #240requirements.txt file, build the package to find the name if not given in the URL. #245name and version if not. #253packaging. #130sections value of a pinned candidate to be reused. #234>, >=, <, <= to combine with star versions. #254Nothing published for this version
Change the behavior of --save-compatible slightly. Now the version specifier saved is using the REAL compatible operator ~= as described in PEP 440. B
--save-compatible slightly. Now the version specifier saved is using the REAL compatible operator ~= as described in PEP 440. Before: requests<3.0.0,>=2.19.1, After: requests~=2.19. The new specifier accepts requests==2.19.0 as compatible version. #225${PROJECT_ROOT} in the dependency specification can be expanded to refer to the project root in pyproject.toml.
The environment variables will be kept as they are in the lock file. #226PYTHONPATH(with python -I mode) when executing pip commands. #231pip 21.0. #235Allow users to hide secrets from the pyproject.toml.
pyproject.toml.
pdm use <path-to-python-root>. #221PYTHONPATH manipulation under Windows platform. #215Correctly build wheels for dependencies with build-requirements but without a specified build-backend #213
Fallback to pypi.org when /search endpoint is not available on given index. #211
Old format is deprecated at the same time.
Poetry, Pipfile, flit) can also be imported as PEP 621 metadata. #175pdm search to query the /search HTTP endpoint. #195classifiers dynamic in pyproject.toml template for autogeneration. #209Pin pdm-pep517 to <0.3.0, this is the last version to support legacy project metadata format.
pdm-pep517 to <0.3.0, this is the last version to support legacy project metadata format.Update the lock file schema, move the file hashes to [metadata.files] table. #196
Provide an option to export requirements from pyproject.toml #190
Improve the user experience of pdm run:
pdm run:
-s/--site-packages to include system site-packages when running. #178setuptools is installed before invoking editable install script. #174wheel not wheels for global projects #182sitecustomize.py instead of a .pth file to enable PEP 582. Thanks @Aloxaf.
Update get_package_finder() to be compatible with pip 20.3. #185Support custom script shortcuts in pyproject.toml.
pyproject.toml.
[tool.pdm.scripts] section.pdm run --list/-l to show the list of script shortcuts. #168pdm install. #169Building editable distribution does not install build-system.requires anymore. #167
build-system.requires anymore. #167Switch the PEP 517 build frontend from build to a home-grown version. #162
Change to Git style config command. #157
Cache the built wheels to accelerate resolution and installation process. #153
Display plain text instead of spinner bar under verbose mode. #150
Allow users to combine several dependency sections to form an extra require. #131
pdm-pep517 to 0.2.0 that supports reading version from SCM. #146Fix a compatibility issue with wheel==0.35. #135
wheel==0.35. #135Fix a bug that extra sources are not respected when fetching distributions. #127
Fix a bug that pdm export fails when the project doesn't have name property. #126
Add a new command export to export to alternative formats. #117
Fix the version constraint parsing of wheel metadata. #120
Update resolvers to resolvelib 0.4.0. #118
resolvelib 0.4.0. #118Switch to upstream resolvelib 0.3.0. #116
resolvelib 0.3.0. #116Add a new command to search for packages #111
Editable packages requires setuptools to be installed in the isolated environment.
setuptools to be installed in the isolated environment.Disable loading of site-packages under PEP 582 mode. #100
Unix style executable script suffix is missing.
Update shebang lines in the executable scripts when doing pdm use. #96
Fix a bug of moving files across different file system. #95
Validate user input for python_requires when initializing project. #89
python_requires when initializing project. #89wheel package is available before building packages. #90pythonfinder, python-cfonts, pip-shims and many others.
Drop dependency vistir. #89Redirect output messages to log file for installation and locking. #84
Support specifying build script for C extensions. #23
pdm build. #81pmd import to import project metadata from Pipfile, poetry, flit, requirements.txt.
#79pdm init and pdm install will auto-detect possible files that can be imported.package_dir is mapped. #81pdm init will use the current directory rather than finding the parents when
global project is not activated.Introduce a super easy-to-extend plug-in system to PDM. #75
Refactor the CLI part, switch from click to argparse, for better extensibility. #73
Add a minimal dependency set for global project. #72
Add a new option -g/--global to manage global project. The default location is at ~/.pdm/global-project.
-g/--global to manage global project. The default location is at ~/.pdm/global-project.-p/--project to select project root other than the default one. #30pdm config del to delete an existing config item. #71Display all available Python interpreters if users don't give one in pdm init. #67
Fix a bug that ImpossiblePySpec's hash clashes with normal one.
ImpossiblePySpec's hash clashes with normal one.Add a new command pdm config to inspect configurations. #26
Improve the user interface of selecting Python interpreter. #54
Allow specifying Python interpreter via --python option in pdm init. #49
Your coding agent can read these notes before it upgrades. Set up the MCP server →