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. 205 green packages (56.9%) have dropped support for Python 3.9;
  2. 155 uncolored packages (43.1%) 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 ✓ packaging ✗ urllib3 ✓ certifi ✗ idna ✗ requests ✓ typing-extensions ✗ charset-normalizer ✗ botocore ✓ setuptools ✓ cryptography ✗ pygments ✗ aiobotocore ✓ pluggy ✗ python-dateutil ✗ six ✓ pyyaml ✗ pydantic ✗ cffi ✗ numpy ✓ click ✓ pytest ✓ pycparser ✓ pydantic-core ✓ iniconfig ✓ grpcio-status ✓ anyio ✓ attrs ✗ s3transfer ✓ protobuf ✓ h11 ✗ fsspec ✓ annotated-types ✗ pandas ✓ httpx ✗ markupsafe ✓ httpcore ✗ platformdirs ✓ typing-inspection ✗ pip ✓ s3fs ✓ jinja2 ✓ filelock ✓ python-dotenv ✓ pathspec ✗ litellm ✓ aiohttp ✓ pyjwt ✗ rich ✗ tqdm ✗ jmespath ✗ yarl ✓ markdown-it-py ✓ sglang ✓ propcache ✓ multidict ✗ jsonschema ✓ rpds-py ✓ starlette ✓ mdurl ✗ aiohappyeyeballs ✓ frozenlist ✗ importlib-metadata ✓ pytz ✗ pyasn1 ✗ google-auth ✓ zipp ✓ virtualenv ✗ aiosignal ✓ wheel ✗ uvicorn ✓ opentelemetry-sdk ✓ trove-classifiers ✓ googleapis-common-protos ✗ referencing ✓ jsonschema-specifications ✗ tzdata ✓ fastapi ✓ pillow ✓ opentelemetry-semantic-conventions ✓ google-api-core ✓ annotated-doc ✗ wrapt ✗ pyasn1-modules ✗ typer ✓ sniffio ✓ grpcio ✓ greenlet ✓ tenacity ✓ shellingham ✗ opentelemetry-api ✓ hatchling ✓ colorama ✗ websockets ✓ beautifulsoup4 ✓ pyarrow ✓ pyparsing ✗ soupsieve ✗ sqlalchemy ✗ scipy ✓ tomli ✓ regex ✓ opentelemetry-proto ✓ huggingface-hub ✓ opentelemetry-exporter-otlp-proto-http ✓ pydantic-settings ✓ distro ✗ psutil ✓ lxml ✗ openai ✗ requests-oauthlib ✗ distlib ✗ python-multipart ✓ jiter ✗ tomlkit ✗ exceptiongroup ✓ textual ✗ watchfiles ✓ more-itertools ✓ cachetools ✓

Top 120 - 240

opentelemetry-instrumentation ✓ oauthlib ✗ proto-plus ✓ opentelemetry-exporter-otlp-proto-common ✓ langchain ✓ openpyxl ✗ multiprocess ✗ wcwidth ✗ et-xmlfile ✗ awscli ✓ opentelemetry-exporter-otlp-proto-grpc ✓ requests-toolbelt ✗ editables ✗ coverage ✓ python-discovery ✗ rsa ✗ dnspython ✓ grpcio-tools ✓ gitpython ✗ mypy-extensions ✗ networkx ✓ smmap ✗ msgpack ✓ google-genai ✓ sortedcontainers ✓ sse-starlette ✓ decorator ✗ ruff ✗ hf-xet ✗ mcp ✓ werkzeug ✓ redis ✓ pyopenssl ✗ gitdb ✗ pytest-json-ctrf ✓ psycopg2-binary ✗ google-cloud-storage ✓ fonttools ✓ keyring ✓ matplotlib ✓ docstring-parser ✗ pytest-asyncio ✓ jaraco-classes ✓ prompt-toolkit ✗ jeepney ✓ secretstorage ✓ pynacl ✗ websocket-client ✗ pydantic-ai-slim ✓ kiwisolver ✓ tokenizers ✓ docutils ✗ contourpy ✓ tiktoken ✓ jaraco-functools ✓ scikit-learn ✓ azure-core ✓ joblib ✗ jaraco-context ✓ isodate ✗ tabulate ✓ pytest-cov ✗ dill ✗ azure-identity ✗ httptools ✓ docker ✗ ptyprocess ✓ defusedxml ✗ pexpect ✓ uvloop ✗ email-validator ✗ orjson ✓ google-cloud-core ✓ itsdangerous ✓ chardet ✓ flask ✓ cycler ✗ async-timeout ✓ bcrypt ✗ nodeenv ✗ alembic ✓ ruamel-yaml ✗ msal ✗ opentelemetry-instrumentation-requests ✓ toml ✗ httpx-sse ✗ opentelemetry-util-http ✓ google-resumable-media ✓ deprecated ✗ threadpoolctl ✗ ipython ✓ tzlocal ✗ xxhash ✗ mako ✗ google-crc32c ✓ google-api-python-client ✗ identify ✓ pre-commit ✓ rapidfuzz ✓ cfgv ✓ blinker ✓ snowflake-connector-python ✓ uritemplate ✓ prometheus-client ✗ pyproject-hooks ✓ uv ✗ weaviate-client ✓ h2 ✗ google-auth-httplib2 ✓ hyperframe ✗ hpack ✗ opentelemetry-exporter-otlp ✓ mypy ✓ poetry-core ✓ traitlets ✓ asn1crypto ✗ zstandard ✗ langchain-core ✓ httplib2 ✓ transformers ✓

Top 240 - 360

ydb ✗ google-cloud-bigquery ✗ google-auth-oauthlib ✓ anthropic ✗ build ✓ jsonpointer ✓ fastjsonschema ✗ executing ✗ jedi ✓ sympy ✗ parso ✗ google-cloud-secret-manager ✓ aiofiles ✗ black ✓ browser-use ✓ sentry-sdk ✗ mpmath ✗ paramiko ✗ matplotlib-inline ✗ asttokens ✗ sqlparse ✗ backoff ✗ pydantic-graph ✓ google-cloud-aiplatform ✓ msal-extensions ✗ google-cloud-batch ✓ pytest-xdist ✗ authlib ✓ asgiref ✗ stack-data ✗ azure-storage-blob ✗ pure-eval ✗ cloudpickle ✗ grpc-google-iam-v1 ✗ joserfc ✓ narwhals ✓ webencodings ✓ kubernetes ✓ types-requests ✓ gunicorn ✓ babel ✗ termcolor ✓ execnet ✗ google-cloud-kms ✗ cachecontrol ✓ marshmallow ✓ datasets ✓ google-cloud-compute ✓ python-json-logger ✓ gcsfs ✓ google-analytics-admin ✓ tree-sitter ✓ jsonpatch ✗ cython ✗ xmltodict ✗ databricks-sdk ✓ setuptools-scm ✓ tornado ✗ librt ✗ opentelemetry-instrumentation-threading ✓ markdown ✓ watchdog ✗ google-cloud-dlp ✓ pymongo ✗ mdit-py-plugins ✗ aioitertools ✓ asyncpg ✗ dulwich ✓ dbt-adapters ✓ pytest-mock ✗ pandas-stubs ✓ google-cloud-pubsub ✓ isort ✓ google-cloud-speech ✓ google-cloud-texttospeech ✗ importlib-resources ✓ tinycss2 ✓ nest-asyncio ✗ linkify-it-py ✓ pkginfo ✗ databricks-sql-connector ✗ structlog ✓ py4j ✗ debugpy ✗ uc-micro-py ✓ dbt-core ✓ xlsxwriter ✗ pyperclip ✗ pypdf ✗ lz4 ✗ fastuuid ✗ typedload ✓ pyzmq ✗ vcs-versioning ✓ jsonschema-path ✓ cyclopts ✓ python-docx ✗ poetry ✓ llama-parse ✓ langsmith ✓ llama-cloud-services ✓ flatbuffers ✓ rich-toolkit ✓ cbor2 ✓ ruamel-yaml-clib ✗ pytokens ✗ types-toml ✓ typing-inspect ✗ slack-sdk ✗ psycopg ✓ installer ✓ safetensors ✓ beartype ✓ cleo ✗ pathable ✓ crashtest ✗ poetry-plugin-export ✓ pymupdf ✓ jsonref ✓ 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.