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.
Ensure pypi.[ca,client]_cert[s] config items are passed to distribution builder install steps to allow for custom PyPI index sources with self signed
pypi.[ca,client]_cert[s] config items are passed to distribution builder install steps to allow for custom PyPI index sources with self signed certificates. #1396pdm init. #1410Fix a lock failure when depending on self with URL requirements. #1347
pdm lock --refresh if some packages has URLs. #1361When adding a package to (or removing from) a group, enhance the formatting of the group name in the printed message. #1329
file:// links the first time they are added. #1325data-requires-python when parsing package links. #1334editables package isn't installed for self package. #1344setup-script, run-setuptools, and is-purelib. #1327Fix a bug that dependencies from different versions of the same package override each other. #1307
pdm run. #1312post_lock for add and update operations, to ensure the pyproject.toml is updated before the hook is run. #1320Add a env_file.override option that allows the user to specify that the env_file should override any existing environment variables. This is not the d
add or update command. #1287packaging dependency to ensure that packaging.utils.parse_wheel_filename is available. #1293Deprecate the top-level imports from pdm module, it will be removed in the future. #1282
pypi.ca_certs config entry. #1240pdm export to available pre-commit hooks. #1279summary field in pdm.lock contains the description from the package's pyproject.toml. #1274pdm show for a package that is only available as source distribution. #1276pip. #1268pdm module, it will be removed in the future. #1282Support Conda environments when detecting the project environment. #1253
python executable in the PATH. #1255metadata.files in pdm.lock. #1256[metadata.files] table of the lock file. #1259env_file variables no longer override existing environment variables. #1235
Write lockfile before calling 'post_lock' hook #1224
Fix a bug that the running env overrides the PEP 582 PYTHONPATH. #1211
PYTHONPATH. #1211pwsh as an alias of powershell for shell completion. #1216zsh completion regarding --pep582 flag. #1218Store file URLs instead of filenames in the lock file, bump lock version to 4.0. #1203
4.0. #1203Integrate pdm venv commands into the main program. Make PEP 582 an opt-in feature. #1162
pdm venv commands into the main program. Make PEP 582 an opt-in feature. #1162global_project.fallback_verbose defaulting to True. When set to False disables message Project is not found, fallback to the global project #1188--only-keep option to pdm sync to keep only selected packages. Originally requested at #398. #1191unearth to 0.4.1 to skip the wheels with invalid version parts. #1178PDM_RESOLVE_MAX_ROUNDS environment variable (was spelled …ROUDNS before). #1180--no-clean option from pdm sync command. #1191Editable dependencies in the [project] table is not allowed, according to PEP 621. They are however still allowed in the [tool.pdm.dev-dependencies] t
[project] table is not allowed, according to PEP 621. They are however still allowed in the [tool.pdm.dev-dependencies] table. PDM will emit a warning when it finds editable dependencies in the [project] table, or will abort when you try to add them into the [project] table via CLI. #1083setup.py project. #1062rich. #1091-v option. #1096unearth to replace pip's PackageFinder and related data models. PDM no longer relies on pip internals, which are unstable across updates. #1096find_matches() to speed up the resolution. #1098publish to PDM since it is required for so many people and it will make the workflow easier. #1107composite script kind allowing to run multiple defined scripts in a single command as well as reusing scripts but overriding env or env_file. #1117--skip to opt-out some scripts and hooks from any execution (both scripts and PDM commands). #1127pre/post_publish, pre/post_run and pre/post_script hooks as well as an extensive lifecycle and hooks documentation. #1147[tool.pdm.build], according to pdm-pep517 1.0.0. At the same time, warnings will be shown against old usages. #1153pyproject.toml rather than building it. #1156[tool.pdm.build] table. #1157post_use hook triggered after successfully switching Python version. #1163respect-source-order under [tool.pdm.resolution] to respect the source order in the pyproject.toml file. Packages will be returned by source earlier in the order or later ones if not found. #593tomllib on Python 3.11 #1072click, halo, colorama and log_symbols. PDM has no vendors now. #1091pdm-pep517 to 1.0.0. #1153pdm 0.x) is no longer supported. #1157tox.ini file for easier local testing against all Python versions. #1160Nothing published for this version
Revert #1106: Do not use venv scheme for prefix kind install scheme. #1158
Fix a defect in the resolution preferences that causes an infinite resolution loop. #1119
Fix bug where SIGINT is sent to the main pdm process and not to the process actually being run. #1095
pdm process and not to the process actually being run. #1095version in the cache key of the locked candidates if they are from a URL requirement. #1099requires-python pre-release versions caused pdm update to fail with InvalidPyVersion. #1111Fix a bug that dependencies are missing from the dep graph when they are depended by a requirement with extras. #1097
setup.cfg or setup.py. #1101pdm update command. #1104venv install scheme when available. This scheme is more stable than posix_prefix scheme since the latter is often patched by distributions. #1106Allow specifying lockfile other than pdm.lock by --lockfile option or PDM_LOCKFILE env var. #1038
pdm.lock by --lockfile option or PDM_LOCKFILE env var. #1038pyproject.toml when running pdm add --no-editable <package>. #1050get_sysconfig_path.py script. #1056${PROJECT_ROOT} variable in the result of export command. #1079Ask for description when doing pdm init and create default README for libraries. #1041
pdm init and create default README for libraries. #1041requirements.txt. #1036pdm use error. #1039optional key when converting from Poetry's dependency entries. #1042Editable installations won't be overridden unless --no-editable is passed. pdm add --no-editable will now override the editable mode of the given pack
--no-editable is passed.
pdm add --no-editable will now override the editable mode of the given packages. #1011pdm lock --refresh. #1019${PROJECT_ROOT} in the output of pdm list. #1004installer 0.5.x. #1002Default the optional license field to "None". #991
Make the path to the global project configurable. Rename the configuration auto_global to global_project.fallback and deprecate the old name. #986
~/.local) with global_project.user_site config. #885auto_global to global_project.fallback and deprecate the old name. #986Update the dependency pdm-pep517 to support PEP 639. #959
Fix a bug that VCS repo name are parsed as the package name. #928
Fix a regression issue that prereleases can't be installed if the version specifier of the requirement doesn't imply that. #920
Fix a bug that bad pip cache dir value breaks PDM's check update function. #922
Fix a bug that incompatible platform-specific wheels are installed. #921
Support pre_* and post_* scripts for task composition. Pre- and Post- scripts for init, build, install and lock will be run if present. #789
pre_* and post_* scripts for task composition. Pre- and Post- scripts for init, build, install and lock will be run if present. #789--config/-c option to specify another global configuration file. #883[tool.pdm.overrides] table. #909use_venv to python.use_venv;
rename config feature.install_cache to install.cache;
rename config feature.install_cache_method to install.cache_method;
rename config parallel_install to install.parallel. #914[tool.pdm.overrides] table. #861requires-python should be produced if ANY(*) is given. #917pdm.lock gets created when --dry-run is passed to pdm add. #918path. #904Print the error and continue if a plugin fails to load. #878
If no command is given to pdm run, it will run the Python REPL. #856
pdm run, it will run the Python REPL. #856direct_url.json for a local pre-built wheel. #861pip<22.0. #874network marker. #858Fix a bug that cache dir isn't created. #843
Fix a resolution error that dots in the package name are normalized to - unexpectedly. #853
- unexpectedly. #853Remember the last selection in use command to save the human effort. And introduce an -i option to ignored that remembered value. #846
use command to save the human effort.
And introduce an -i option to ignored that remembered value. #846Support setting Python path in global configuration. #842
pdm update even if --no-sync is passed. #837Allow changing the installation linking method by feature.install_cache_method config. #822
feature.install_cache_method config. #822Don't symlink pycaches to the target place. #817
Add lock --refresh to update the hash stored with the lock file without updating the pinned versions. #642
lock --refresh to update the hash stored with the lock file without updating the pinned versions. #642[tool.pdm.overrides] table. #790post_init, pre_lock, post_lock, pre_install and post_install. #798install --check to check if the lock file is up to date. #810allow_prereleases setting.
Now non-named requirements are resolved earlier than pinned requirements. #799atoml to tomlkit as the style-preserving TOML parser. The latter has supported TOML v1.0.0. #809Change the default version save strategy to minimum, without upper bounds. #787
Fix the resolution order to reduce the loop number to find a conflict. #781
Support --pre/--prerelease option for pdm add and pdm update. It will allow prereleases to be pinned. #774
--pre/--prerelease option for pdm add and pdm update. It will allow prereleases to be pinned. #774git+https candidates cannot be resolved. #771Move version from [project] table to [tool.pdm] table, delete classifiers from dynamic, and warn usage about the deprecated usages. #748
version from [project] table to [tool.pdm] table, delete classifiers from dynamic, and warn usage about the deprecated usages. #748x >= VERSION when adding dependencies. #752pdm list --freeze to fix a bug due to Pip's API change. #533requires-python. #744-s/--section option from all previously supported commands. Use -G/--group instead. #756Use importlib to replace imp in the sitecustomize module for Python 3. #574
Add a new option -s/--site-packages to pdm run as well as a script config item. When it is set to True, site-packages from the selected interpreter wi
-s/--site-packages to pdm run as well as a script config item. When it is set to True, site-packages from the selected interpreter will be loaded into the running environment. #733NO_SITE_PACKAGES isn't set in pdm run if the executable is out of local packages. #733Isolate the project environment with system site packages in pdm run, but keep them seen when PEP 582 is enabled. #708
pdm run, but keep them seen when PEP 582 is enabled. #708pip with --isolated when building wheels. In this way some env vars like PIP_REQUIRE_VIRTUALENV can be ignored. #669pip is not DEBUNDLED. #685summary is None, the lockfile can't be generated. #719${PROJECT_ROOT} should be written in the URL when relative path is given. #721pdm import can't merge the settings correctly. #723Add --no-sync option to update command. #684
--no-sync option to update command. #684find_links source type. It can be specified via type key of [[tool.pdm.source]] table. #694--dry-run option to add, install and remove commands. #698project.core.ui.display_columns), fixing unnecessary wrapping due to / with empty lines full of spaces in case of long URLs in the last column. #680check_update is boolean. #689setup_dev.py in favor of pip install. #676Fix a bug that requires-python is not recognized in candidates evaluation. #657
requires-python is not recognized in candidates evaluation. #657installer to 0.3.0, fixing a bug that broke installation of some packages with unusual wheel files. #653packaging and typing-extensions to direct dependencies. #674requires-python now participates in the resolution as a dummy requirement. #658Fix the error of regex to find the shebang line. #656
Support --no-isolation option for install, lock, update, remove, sync commands. #640
Allow to build in non-isolated environment, to enable optional speedups depending on the environment. #635
Fix the removal issue of standalone pyc files #633
Add -r/--reinstall option to sync command to force re-install the existing dependencies. #601
-r/--reinstall option to sync command to force re-install the existing dependencies. #601pdm cache clear can clear cached installations if not needed any more. #604setuptools won't see the dependencies under local packages. #601direct_url.json when installing wheels. #607* fails to be converted as SpecifierSet. #609Deprecate -s/--section option in favor of -G/--group. #591
--json to the list command which outputs the dependency graph as a JSON document. #583feature.install_cache. When it is turned on, wheels will be installed into a centralized package repo and create .pth files under project packages directory to link to the cached package. #589pdm show. #580~/.pyenv/shims/python3 as the pyenv interpreter. #590-s/--section option in favor of -G/--group. #591pdm/installers/installers.py is renamed to pdm/installers/manager.py to be more accurate. The Installer class under that file is renamed to InstallerManager and is exposed in the pdm.core.Core object for overriding. The new pdm/installers/installers.py contains some installation implementations. #589pkg_resources.Distribution to the implementation of importlib.metadata. #592Remove the existing files before installing. #565
Accept non-canonical distribution name in the wheel's dist-info directory name. #529
distlib. #519Support showing individual fields by -- options in pdm show. When no package is given, show this project. #527
--<field-name> options in pdm show. When no package is given, show this project. #527--freeze option to pdm list command which shows the dependencies list as pip's requirements.txt format. #531PYTHONPATH. #522Extract package name from egg-info in filename when eligible. Remove the patching code of resolvelib's inner class. #441
plugin to manage pdm plugins, including add, remove and list commands. #510resolvelib any more. This makes PDM more stable across updates of sub-dependencies. #515Add an option -u/--unconstrained to support unconstraining version specifiers when adding packages. #501
-u/--unconstrained to support unconstraining version specifiers when adding packages. #501No significant changes.
No significant changes.
No significant changes.
No significant changes.
Your coding agent can read these notes before it upgrades. Set up the MCP server →