Python 3.9 Readiness

Python 3.9 support graph for the 360 most popular Python packages!

What is this about?

Python 3.9 is a version of Python that is past its End Of Life. This site shows Python 3.9 support for the 360 most downloaded packages on PyPI:

  1. 134 green packages (37.2%) have dropped support for Python 3.9;
  2. 226 uncolored packages (62.8%) still support Python 3.9.

Package 'x' is uncolored. What can I do?

There can be many reasons a package is still supporting Python 3.9:

  • If you are package maintainer, it's time to start dropping support (if you haven't already). Here is an in-depth guide to Dropping support for older Python versions. If you are not able to give the time needed, please seek for help from the community.

  • If you are user of the package, send a friendly note to the package maintainer. Or fork it, and send a pull request to help move the project towards dropping Python 3.9 support.

How do you identify Python 3.9 support?

We look for the Programming Language :: Python :: 3.9 classifier on the latest release of the project, via PyPI's JSON API.

Top 120

boto3 ✗ urllib3 ✗ setuptools ✓ certifi ✗ packaging ✗ requests ✗ idna ✗ typing-extensions ✗ charset-normalizer ✗ botocore ✗ aiobotocore ✗ python-dateutil ✗ six ✓ grpcio-status ✗ cryptography ✗ cffi ✗ pyyaml ✗ s3transfer ✗ numpy ✓ pycparser ✓ s3fs ✓ protobuf ✓ pip ✗ pydantic ✗ fsspec ✓ click ✓ pandas ✓ pluggy ✗ attrs ✗ pydantic-core ✗ pygments ✗ anyio ✗ h11 ✗ wheel ✗ platformdirs ✓ markupsafe ✓ annotated-types ✗ jmespath ✗ filelock ✓ grpcio ✗ jinja2 ✓ pathspec ✗ importlib-metadata ✓ httpx ✗ pyjwt ✗ typing-inspection ✗ httpcore ✗ pytest ✓ rsa ✗ zipp ✓ rich ✗ pytz ✗ pyasn1 ✗ iniconfig ✓ python-dotenv ✗ aiohttp ✗ jsonschema ✓ multidict ✗ google-auth ✗ yarl ✗ google-api-core ✗ tomli ✓ tzdata ✓ tqdm ✗ virtualenv ✗ markdown-it-py ✓ scipy ✓ frozenlist ✗ propcache ✗ trove-classifiers ✓ uvicorn ✓ googleapis-common-protos ✗ colorama ✗ rpds-py ✓ pillow ✓ aiosignal ✓ mdurl ✗ greenlet ✓ awscli ✗ referencing ✓ requests-oauthlib ✗ sqlalchemy ✗ pyasn1-modules ✗ jsonschema-specifications ✗ wrapt ✗ fastapi ✓ pyarrow ✓ psutil ✓ google-genai ✓ aiohappyeyeballs ✗ grpcio-tools ✓ starlette ✓ hatchling ✓ yandexcloud ✗ oauthlib ✗ pyparsing ✗ opentelemetry-proto ✗ cachetools ✓ opentelemetry-semantic-conventions ✗ openpyxl ✗ et-xmlfile ✗ lxml ✗ tenacity ✓ regex ✓ opentelemetry-api ✗ opentelemetry-sdk ✗ tomlkit ✗ websocket-client ✗ annotated-doc ✗ more-itertools ✗ opentelemetry-exporter-otlp-proto-grpc ✗ beautifulsoup4 ✓ shellingham ✗ soupsieve ✗ docutils ✗ langchain ✓ typer ✓ sniffio ✓ exceptiongroup ✓ requests-toolbelt ✗

Top 120 - 240

pyopenssl ✗ pydantic-settings ✓ distlib ✗ proto-plus ✗ msgpack ✓ flask ✓ websockets ✓ werkzeug ✓ openai ✗ google-cloud-storage ✗ opensearch-py ✓ opentelemetry-exporter-otlp-proto-http ✗ dnspython ✓ mypy-extensions ✗ pynacl ✗ requests-aws4auth ✗ coverage ✓ psycopg2-binary ✗ isodate ✗ python-multipart ✓ textual ✗ events ✓ decorator ✗ wcwidth ✗ keyring ✓ distro ✗ opentelemetry-exporter-otlp-proto-common ✗ huggingface-hub ✗ networkx ✓ sortedcontainers ✓ poetry-core ✓ scikit-learn ✓ matplotlib ✓ azure-core ✗ opentelemetry-exporter-otlp ✗ azure-identity ✗ fonttools ✓ jaraco-classes ✓ secretstorage ✓ snowflake-connector-python ✗ joblib ✗ opensearch-protobufs ✓ jeepney ✓ gitpython ✗ msal ✗ bcrypt ✗ pexpect ✓ ptyprocess ✓ redis ✓ kiwisolver ✓ ruff ✗ jaraco-context ✓ jaraco-functools ✓ editables ✗ google-cloud-aiplatform ✗ jiter ✗ defusedxml ✗ watchfiles ✗ google-cloud-core ✗ ruamel-yaml ✗ async-timeout ✓ types-requests ✓ zstandard ✗ itsdangerous ✓ threadpoolctl ✗ tabulate ✗ contourpy ✓ alembic ✓ smmap ✗ rapidfuzz ✓ gitdb ✗ asn1crypto ✗ email-validator ✗ prompt-toolkit ✗ deprecated ✗ orjson ✓ google-crc32c ✓ opentelemetry-instrumentation ✗ google-resumable-media ✗ chardet ✓ pytest-cov ✗ tzlocal ✗ kubernetes ✗ blinker ✓ paramiko ✗ docker ✗ setuptools-scm ✗ google-cloud-bigquery ✗ google-api-python-client ✗ prometheus-client ✗ backoff ✗ pytest-asyncio ✓ dill ✗ pyproject-hooks ✓ cycler ✗ build ✗ fastjsonschema ✗ google-auth-oauthlib ✗ uritemplate ✓ mako ✗ marshmallow ✓ docstring-parser ✗ gcsfs ✓ google-auth-httplib2 ✗ msal-extensions ✗ httplib2 ✓ azure-storage-blob ✗ uv ✗ hf-xet ✗ tokenizers ✗ sqlparse ✗ sympy ✗ babel ✗ jsonpointer ✗ transformers ✓ google-cloud-secret-manager ✗ aiofiles ✗ xmltodict ✗ google-cloud-batch ✗ grpcio-health-checking ✗

Top 240 - 360

isort ✓ uvloop ✗ ipython ✓ nodeenv ✗ aliyun-python-sdk-core ✗ google-analytics-admin ✗ opentelemetry-exporter-prometheus ✗ mypy ✗ mpmath ✗ py4j ✗ mcp ✓ cloudpickle ✗ cython ✗ parso ✗ opentelemetry-util-http ✗ black ✓ traitlets ✓ tornado ✗ tiktoken ✓ gunicorn ✓ pre-commit ✓ jedi ✗ importlib-resources ✓ opentelemetry-instrumentation-requests ✗ executing ✗ httpx-sse ✗ httptools ✓ langchain-core ✓ durationpy ✓ authlib ✗ cattrs ✓ asgiref ✗ toml ✗ sse-starlette ✗ identify ✓ litellm ✗ asttokens ✗ matplotlib-inline ✗ cfgv ✓ dbt-core ✓ sentry-sdk ✗ markdown ✓ nest-asyncio ✗ requests-file ✓ grpc-google-iam-v1 ✗ portalocker ✗ python-json-logger ✗ databricks-sdk ✗ pandas-stubs ✓ pytest-xdist ✗ pymongo ✗ cachecontrol ✓ stack-data ✗ webencodings ✓ pure-eval ✗ typer-slim ✓ execnet ✗ jsonpatch ✗ xxhash ✗ typing-inspect ✗ aioitertools ✓ pymysql ✓ debugpy ✗ awswrangler ✓ jsonschema-path ✓ watchdog ✗ dulwich ✓ pkginfo ✗ termcolor ✓ h2 ✗ hyperframe ✗ hpack ✗ dbt-adapters ✓ typedload ✓ pyzmq ✗ pywin32 ✗ msrest ✗ pytest-mock ✗ databricks-sql-connector ✗ ruamel-yaml-clib ✗ dataclasses-json ✗ snowflake-sqlalchemy ✗ lz4 ✗ poetry ✓ pycryptodome ✗ torch ✓ langsmith ✓ ray ✓ rich-toolkit ✓ semver ✗ dbt-common ✓ invoke ✗ google-cloud-monitoring ✗ smart-open ✓ sphinx ✓ pyperclip ✗ google-cloud-speech ✗ mccabe ✗ pylint ✓ slack-sdk ✗ google-cloud-kms ✗ google-cloud-vision ✗ pendulum ✗ pathable ✓ multiprocess ✗ google-cloud-compute ✗ argcomplete ✗ rfc3339-validator ✓ ply ✓ jsonpath-ng ✓ google-cloud-tasks ✗ pygithub ✗ google-cloud-dlp ✗ arrow ✗ deepdiff ✗ tinycss2 ✓ datadog ✗ jupyter-core ✓ installer ✓ notebook ✗

Thanks

This is derivative work from py3readiness.org, a site that previously tracked general compatibility with Python 3, which in turn was a derivative of pythonwheels.com, a site that tracks which Python distributions ship the wheel distribution.