NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1390 most downloaded on PyPI
A modern Python package and dependency manager supporting the latest PEP standards
Last release today
17 Sep 2026
Ships fairly regularly
a new release about every 3 weeks
Nearly every release is documented
notes for 58 of the last 60 stable releases
9 versions withdrawn
withdrawn after publishing
7 years old
254 releases · first in 2020
One column per quarter.
Revert the package cache introduced in 2.13. Don't cache the decompressed contents of wheels unless being told so.
Fix inconsistent logging when pdm use a different python interpreter ( #2776 )
Fix PDM unable to find Python interpreters when PDM_IGNORE_ACTIVE_VENV is set ( #2779 )
Check verify_ssl when trusting each source. ( #2784 )
Fix name check for project itself in pdm outdated ( #2785 )
Fix a regression that proxy env vars are not respected. ( #2788 )
Fix an issue that venv provider can't be found when providers are explicitly configured. ( #2792 )
Fix a bug that [tool.pdm.options] are ignored if -c/--config CONFIG is given. ( #2793 )
Make --without respect groups in dev-dependencies ( #2799 )
Per-source configuration for ca-certs and client-cert. #2754
Per-source configuration for ca-certs and client-cert. #2754
Remove all caches by removing individual cache types one by one. #2757
Use the default HTTP client when downloading the pythons, to use the certificates settings. #2759
Fix a race condition where pth files take effect when multiple packages are installed in parallel. #2762
Refuse to run recursive composite scripts. #2766
Fix errors when parsing poetry format that contains special characters in author name. Poetry-specific parse_name_email and NAME_EMAIL_RE moved from p
Fix errors when parsing poetry format that contains special characters in author name. Poetry-specific parse_name_email and NAME_EMAIL_RE moved from pdm.formats.base to pdm.formats.poetry . #2665
Fix a race condition in cached packages. When a cached package is being created it shouldn't be used for installation. #2739
Add back PreparedCandidate.build() for backward-compatibility. #2747
Fix a bug that PDM couldn't find interpreters for global project. #2726
Fix a bug that PDM couldn't find interpreters for global project. #2726
Make the cache package path shorter to solve the Windows path problem. #2730
Remove pdm.models.environment module deprecated before. Also remove the renamed members from pdm.environments . #2710
Add option to exclude group(s) when running pdm sync/install -G:all by adding flag --without group1,group2,... #2258
Default to log to user home and make logs directory configurable. #2398
Add an option keep_going to continue on errors for composite scripts and return the last failing exit code. #2582
Add an option working_dir for PDM's scripts to set the current working directory. #2620
Allow updating specific sub-dependencies (i.e., transitive dependencies) in the lock file. #2628
Add --config-setting option to add/install/sync/update/remove/export commands, the config settings dictionary will be shared by all packages. #2636
Cache the decompressed contents of wheels for faster access. #2660
Add configuration for timeout for network requests. #2680
Reuse the request session within the environment. #2697
Caches can be disabled by using the --no-cache option or setting the PDM_NO_CACHE environment variable. #2702
Switch to httpx.Client for HTTP requests, drop requests dependency. #2709
We have timemachine now! You can exclude packages published newer than a certain date via pdm lock --exclude-newer=<date> , allowing reproduction of resolutions regardless of new package releases. #2712
Add command pdm outdated to check the outdated packages and list the latest versions. #2718
When python.use_venv is on, always try to create a virtualenv when using pdm use to switch the Python interpreter. #2720
Support installing Pythons from python-build-standalone . Add command group pdm python to manage Python installations. And pdm use can automatically install the Python interpreter if it's not found. #2721
Supports custom distribution files path via -d/--dest option for pdm publish . #2723
Don't modify TOML tables that are not related to PDM. #2666
Made --without imply --with :all . #2670
Expand user path for venv.location and other path-like config values. #2672
Give a default version when it's missing in pyproject.toml when parsing candidate's metadata. #2677
Fix the issue that ANSI codes are shown in the output of pdm --help on Windows. #2678
Don't show empty configuration sections in pdm config . #2683
Remove the support of pth cache method. And symlink cache method now behaves the same as symlink_individual cache method. #2660
Remove pdm.models.environment module deprecated before. Also remove the renamed members from pdm.environments . #2710
Use env PDM_NO_EDITABLE as the default value for --no-editable option. #2613
--frozen-lockfile is passed. #2630fix the package-type fixer won't update toml properly for "Nested Section Ordering Issue in TOML". #2578
Fix the auto fixer for package-type. #2564
Hotfix: missing identifier attribute for package type fixer. #2564
identifier attribute for package type fixer. #2564Change the warning category emitted by deprecated_warning() to PDMDeprecationWarning. #2547
tool.pdm.resolution.excludes setting, the dependencies will also be skipped. #1316--no-lock option to --frozen-lockfile. #2496--no-hashes as the recommended option name in favor of --without-hashes for pdm export command. #2497--no-markers to export command to exclude markers from the output. #2497pdm init minimal. #2543deprecated_warning() to PDMDeprecationWarning. #2547--stable option. #2552tracked_names argument to keyword-only. Move allow_prereleases setting to tool.pdm.resolution table. #2552preferred_pins argument of provider classes to locked_candidates, and deprecate the old name. #2552package-type field under tool.pdm settings table to distribution to make it more clear. #2564tool.pdm.resolution settings won't be honored when installing dependencies into the build environment. #1316cmd scripts. #2542Project. Remove deprecated helper functions from actions.py. #2547Fix a KeyError raised when resolving a URL dependency without package name given. #2488
pdm update --update-eager can hit InconsistentCandidate error when dependency is included both through default dependencies and extra. #2495pdm install should not warn when overwriting its own symlinks on install/update. #2502Update candidate names before resolving markers, to fix a KeyError when the requirement is not named. #2488
Officially drop the support for Python 3.7.
pdm export. #1910--skip-existing to pdm publish to ignore the uploading error if the package already exists. #2362==major.minor.* as default requires python for application projects. #2382package-type field in the tool.pdm table to differentiate between library and application projects. #2394pdm lock now supports --update-reuse option to keep the pinned versions in the lockfile if possible. #2419inherit_metadata to inherit and merge markers from parent requirements. This is enabled by default when creating a new lockfile. #2421symlink_individual for creating a symlink for each individual package file and hardlink for creating hardlinks. #2425reuse-installed. When this strategy is enabled, PDM will try to reuse the versions already installed in the environment, even if the package names are given in the command line following add or update. This strategy is supported by add, update and lock commands. #2479PDM_CACHE_DIR environment variable to configure cache directory location. #2485pdm init -n. #2436pdm init now implies --lib if --backend is passed. #2437install.cache_method = "symlink". #2466KeyError raised by pdm update --unconstrained when the project itself is listed as a dependency. #2483Do not detect as requirements.txt if the file is a python script. #2416
-r requirements paths relative to the requirement file they are specified in #2422Create virtualenv for conda base Python. #2409
Log the response text when pdm publish fails with HTTP error. #2400
pdm publish fails with HTTP error. #2400__init__.py contains an unusual line. #2378pdm init being read-only when copied from a read-only PDM installation. #2379export command. #2390Fix a bug preventing ctrl-c from interrupting program execution on 2nd invocation when using "pdm run" (Windows only). #2292
--extra--index-url #2342--static-urls and --no-cross-platform are deprecated at the same time. #2310
include_packages and exclude_packages config under tool.pdm.source table. #1645requires-python range. And provide a way to ignore them per-package. #2304-q/--quiet option to suppress some warnings printed to the console. This option is mutually exclusive with -v/--verbose. #2304--strategy/-S option for lock command, to specify one or more strategy flags for resolving dependencies. --static-urls and --no-cross-platform are deprecated at the same time. #2310pdm.cli.commands.venv.backend.Backend._ensure_clean to empty the .venv folder instead of deleting it. #2282--venv option. #2314Revert the changes to the behavior of installing self, introduced in #2162. Self package won't be installed when --no-default is requested. #2230
--no-default is requested. #2230--no-isolated does. #2071Fix an issue that --no-lock option doesn't work as expected. Also support --no-lock option for add, remove and update commands. #2245
--no-lock option doesn't work as expected. Also support --no-lock option for add, remove and update commands. #2245findpython to find pythons with the spec given by the user. #2225virtualenv python.exe binary under bin/
as well as Scripts/ and the virtualenv/conda root. #2236${PROJECT_ROOT} variable in the lockfile. #2240Support convert setup.cfg without existing setup.py. #2222
Add an --overwrite option to pdm init to overwrite existing files(default False). #2163
--overwrite option to pdm init to overwrite existing files(default False). #2163pdm list command.
Add --tree as an alias and preferred name of --graph option. #2165pdm run to run a script with the relative or absolute path. #2217@ file:// dependencies can not be updated. #2169requires-python cause PDM to crash. #2175comparable_version("1.2.3+local1") == Version("1.2.3"). #2182pdm-pep517. #2167Allow setting username and password in URL for publish command #2140
Add keyring, copier, cookiecutter, template, truststore dependency groups. #2109
keyring, copier, cookiecutter, template, truststore dependency groups. #2109PDM_PROJECT for -p/--project option. #2126pyproject.toml if both --unconstrained and --dry-run are passed to pdm update. #2125build-system table when importing from other package manager. #2126unearth to 0.10.0 #2113Support target python with other architectures. #2078
pdm install. #2086Fix a bug that dependencies can't be updated when the table is separated by another table. #2056
*_lock hooks are always emitted with dry_run=True in pdm update. #2060pdm install --plugins can't install self. #2062Add support for cookiecutter and copier as project generator. #2059
cookiecutter and copier as project generator. #2059Fix the breaking change by adding the functions back to the old location with deprecation warnings. #2013
pdm init now accepts a template argument to initialize project from a built-in or Git template. #2053DeprecationWarning with FutureWarning for better exposure. #2012install-pdm.py and its checksum file on the docs site. #2026--edit/-e to pdm config to edit the config file in default editor. #2028--project option to pdm venv to support another path as the project root. #2042truststore as the SSL backend. This only works on Python 3.10 or newer. #2049pdm self list. #2018url field when converting requirements from a Pipfile-style file requirement. #2032No significant changes.
No significant changes.
Pop up a warning when the deprecated parser argument is passed to BaseCommand.__init__() method. #2007
Do not use the deprecated nested argument groups. #1988
pdm list. #1973pdm init -n doesn't respect the --python option. #1984setup.py if it prints something to stdout. #1995install-pdm.py. #1996Switch HTTP data cache to use a split body setup, where the actual body contents are not written to disk unless changed. Previously, any changed heade
When keyring is available, either by importing or by CLI, the credentials of repositories and PyPI indexes will be saved into it. #1908
repository.custom.verify_ssl config option as well as new command line argument of publish command. #1928PATH env var. #1944ResourceWarnings when running the test suite with warnings enabled. #1915tool.poetry.build doesn't exist. #1935pdm import clobbers build-system.requires value in pyproject.toml. #1948Fix the error when publishing using trusted publisher. #1868
Install project-level plugins from project config, with tool.pdm.plugins setting. #1461
tool.pdm.plugins setting. #1461--json flag to both run and info command allowing to dump scripts and infos as JSON. #1854_) as internal tasks and hide them from the listing. #1855pdm init -n(non-interactive mode), a venv will be created by default. Previously, the selected Python will be used under PEP 582 mode. #1862--no-cross-platform to pdm lock to create a non-cross-platform lockfile. #1898--venv option descriptions in zsh completion script. #1847package and package[extra]. #1851FileNotFoundError if the requirement path is not found. #1875Fix a double reading issue due to cachecontrol not compatible with urllib3 2.0. #1894
No significant changes.
No significant changes.
Pin the urllib3 to <2.0 to avoid incompatibility with cachecontrol. #1886
<2.0 to avoid incompatibility with cachecontrol. #1886Fix the wrong argument validation for update command, where packages given with group option should be allowed. #1836
Regression(#1710): Don't crash when trying to update the shebang in a binary script #1827
Fix a bug that pdm --pep582 raises an argument error. #1823
pdm --pep582 raises an argument error. #1823When resolution.respect-source-order is enabled, sources are lazily evaluated. This means that if a match is found on the first source, the remaining
resolution.respect-source-order is enabled, sources are lazily evaluated. This means that if a match is found on the first source, the remaining sources will not be requested. #1509--venv <venv> to run a command in the virtual environment with the given name. #1705PDM_PREFER_BINARY environment variable. #1817pdm lock. #1796environment.is_global property. #1814pdm init -p <dir> if the target directory is not created yet. #1822Switch the default build backend to pdm-backend. #1684
pdm-backend. #1684pdm.toml which can be committed to the VCS. #1742Environment is renamed to PythonLocalEnvironment and GlobalEnvironment is renamed to PythonEnvironment. Move pdm.models.environment module to pdm.environments package. #1791unearth to 0.8 to allow calling keyring from CLI. #1653venv command to show the path or the python interpreter for a managed venv. #1680--lib option to init command to create a library project without prompting. #1708pdm fix to migrate to the new PDM features. Add a hint when invoking PDM commands. #1743.pdm-python in project root .gitignore when running pdm init. #1749PDM_IGNORE_ACTIVE_VENV env var. #1782pre_invoke to emit before any command is invoked. #1792pdm export due to non-deterministic order of group iteration. #1786pdm show --version #1788installer to 0.7.0 and emit a warning if the RECORD validation fails. #1784Fix a bug of synchronization of not considering the revision of VCS requirement in comparison. #1762
Fix the resolution order to prefer the packages causing the conflict. This can make the resolution reach a solution faster. #1752
Abort if lockfile isn't generated when executing pdm export. #1730
pdm export. #1730venv.prompt configuration when using conda as the backend. #1734. with - when normalizing package name. #1745pdm venv activate without specifying env_name to activate in project venv created by conda #1735Fix a resolution failure when the project has cascading relative path dependencies. #1702
Fix a bug that built wheels are prioritized over source distributions with higher version number. #1698
Add more intuitive error message when the requires-python doesn't work for all dependencies. #1690
Eliminate the deprecation warnings from importlib.resources. #1660
pdm-pep517 instead of setuptools. #1658importlib.resources. #1660Skip some tests on packaging < 22. #1649
Add proper display for the extra pypi sources in pdm config. #1622
pdm config. #1622python. #1626packaging>=22. #1619subdirectory attribute to the lockfile entry. #1630Support multiple PyPI indexes in the configuration. They will be tried after the sources in pyproject.toml. #1310
pyproject.toml. #1310pytest plugin pdm.pytest for plugin developers. #1594pdm.lock with an @generated comment. #1611Detect PDM inside a zipapp and disable some functions. #1578
Allow relative paths in build-system.requires, since build and hatch both support it. Be aware it is not allowed in the standard. #1560
build-system.requires, since build and hatch both support it. Be aware it is not allowed in the standard. #1560packaging 22.0. #1562__file__ usages with importlib.resources, to make PDM usable in a zipapp. #1567package==22.0 from the dependencies to avoid some breakages to the end users. #1568Fix an installation failure when the RECORD file contains commas in the file path. #1010
pdm.pep517 as the metadata transformer for unknown custom build backends. #1546Fix a resolution loop issue when the current project depends on itself and it uses the dynamic version from SCM. #1541
Rename the tool.pdm.overrides table to tool.pdm.resolution.overrides. The old name is deprecated at the same time. #1503
tool.pdm.overrides table to tool.pdm.resolution.overrides. The old name is deprecated at the same time. #1503--backend option to pdm init command, users can choose a favorite backend from setuptools, flit, hatchling and pdm-pep517(default), since they all support PEP 621 standards. #1504{args[:default]} placeholder. #1507python.use_venv=False #1508findpython installed. #1516install.cache set to true and caching method is pth. #863pdm-pep517. #1504pep517 with pyproject-hooks because of the rename. #1528setup.py format, users are encouraged to migrate to the PEP 621 metadata. #1504Make sitecustomize.py respect the PDM_PROJECT_MAX_DEPTH environment variable #1471
Remove the usages of old config names deprecated since 2.0. #1422
venv.prompt configuration to allow customizing prompt when a virtualenv is activated #1332ca_certs or from the command line via pdm publish --ca-certs <path> .... #1392plugin command to self, and it can not only manage plugins but also all dependencies. Add a subcommand self update to update PDM itself. #1406pdm init to receive a Python path or version via --python option. #1412requires-python when importing from other formats. #1426pdm instead of pip to resolve and install build requirements. So that PDM configurations can control the process. #1429pdm config command. #1450pdm lock --check flag to validate whether the lock is up to date. #1459pip when creating a new venv. #1463pdm list command with new formats: --csv,--markdown and add options --fields,--sort to control the output contents. Users can also include licenses in the --fields option to display the package licenses. #1469pdm lock --check in pre-commit. #1471--project argument. #1220pypi.[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. #1410python* command in pdm run. #1414==1.*). #1465importlib-metadata from PyPI for Python < 3.10. #1467Your coding agent can read these notes before it upgrades. Set up the MCP server →