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

Top 120 - 240

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

Top 240 - 360

pypdf ✗ deprecated ✗ traitlets ✓ narwhals ✓ google-cloud-secret-manager ✓ sympy ✗ rapidfuzz ✓ librt ✗ msal-extensions ✗ mpmath ✗ awscli ✓ asn1crypto ✗ langchain-core ✓ cloudpickle ✗ jsonpointer ✓ aiofiles ✗ paramiko ✗ executing ✗ fastuuid ✗ authlib ✓ asttokens ✗ google-cloud-aiplatform ✓ pytest-xdist ✗ sqlparse ✗ google-cloud-batch ✓ isort ✓ gunicorn ✓ jedi ✓ pyproject-hooks ✓ parso ✗ joserfc ✓ fastjsonschema ✓ azure-storage-blob ✗ execnet ✗ gcsfs ✓ webencodings ✓ grpc-google-iam-v1 ✓ matplotlib-inline ✗ asgiref ✓ databricks-sdk ✓ pydantic-ai-slim ✓ poetry-core ✓ build ✓ stack-data ✗ pure-eval ✗ google-cloud-kms ✓ truststore ✓ psycopg ✓ google-analytics-admin ✓ jsonpatch ✗ google-cloud-compute ✓ babel ✗ mdit-py-plugins ✗ psycopg-binary ✓ markdown ✓ termcolor ✓ xmltodict ✗ linkify-it-py ✓ cachecontrol ✓ cython ✗ asyncpg ✗ google-cloud-dlp ✓ python-docx ✗ python-json-logger ✓ uc-micro-py ✓ google-cloud-speech ✓ safetensors ✓ setuptools-scm ✗ weaviate-client ✓ marshmallow ✓ langsmith ✓ google-cloud-pubsub ✓ dbt-adapters ✓ google-cloud-texttospeech ✓ pydantic-graph ✓ httpx2 ✓ watchdog ✗ tornado ✗ cbor2 ✓ pytokens ✗ vcs-versioning ✗ httpcore2 ✓ types-requests ✓ tinycss2 ✓ structlog ✓ pymongo ✗ kubernetes ✓ playwright ✓ pymupdf ✓ aioitertools ✓ xlsxwriter ✗ tree-sitter ✓ google-cloud-logging ✓ types-toml ✓ lz4 ✗ opentelemetry-exporter-prometheus ✓ py4j ✗ fastmcp ✓ pymysql ✓ pyzmq ✗ dbt-core ✓ google-cloud-monitoring ✓ grpclib ✓ pyperclip ✗ croniter ✗ types-certifi ✓ fastapi-cli ✓ griffelib ✓ pyee ✗ flatbuffers ✓ tomli-w ✓ beartype ✓ brotli ✓ google-cloud-tasks ✓ modal ✓ pytest-mock ✗ pydantic-extra-types ✗ importlib-resources ✓ opentelemetry-instrumentation-fastapi ✓ nest-asyncio ✗

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.