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

Top 120 - 240

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

Top 240 - 360

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

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.