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

Top 120 - 240

opentelemetry-proto ✗ openai ✗ websocket-client ✗ et-xmlfile ✗ grpcio-tools ✓ jiter ✗ sse-starlette ✓ dnspython ✓ google-cloud-storage ✓ mypy-extensions ✗ werkzeug ✓ distro ✗ redis ✓ opentelemetry-exporter-otlp-proto-http ✗ coverage ✓ textual ✗ langchain ✓ networkx ✓ msgpack ✓ wcwidth ✗ editables ✗ huggingface-hub ✓ pyopenssl ✗ psycopg2-binary ✗ ptyprocess ✓ google-genai ✓ pexpect ✓ decorator ✗ pynacl ✗ fonttools ✓ smmap ✗ keyring ✓ sortedcontainers ✓ async-timeout ✓ docker ✗ opentelemetry-exporter-otlp-proto-common ✗ python-discovery ✗ tabulate ✓ httpx-sse ✗ matplotlib ✓ docstring-parser ✗ jaraco-classes ✓ gitpython ✗ secretstorage ✓ isodate ✗ jeepney ✓ scikit-learn ✓ kiwisolver ✓ opentelemetry-exporter-otlp-proto-grpc ✗ flask ✓ google-cloud-core ✗ ruff ✗ uvloop ✗ jaraco-context ✓ contourpy ✓ jaraco-functools ✓ opentelemetry-instrumentation ✗ prompt-toolkit ✗ gitdb ✗ joblib ✗ azure-identity ✗ bcrypt ✗ azure-core ✗ email-validator ✗ httptools ✓ google-resumable-media ✗ msal ✗ itsdangerous ✓ sglang ✓ types-requests ✓ google-crc32c ✓ threadpoolctl ✗ pytest-cov ✗ orjson ✓ snowflake-connector-python ✗ defusedxml ✗ alembic ✓ deprecated ✗ chardet ✓ ruamel-yaml ✗ zstandard ✗ blinker ✓ pytest-asyncio ✓ dill ✗ cycler ✗ hf-xet ✗ multiprocess ✗ kubernetes ✗ rapidfuzz ✓ poetry-core ✓ tzlocal ✗ google-api-python-client ✗ prometheus-client ✗ uv ✗ sympy ✗ toml ✗ mako ✗ backoff ✗ asn1crypto ✗ mpmath ✗ ipython ✓ pyproject-hooks ✓ tree-sitter ✓ mypy ✓ google-cloud-bigquery ✗ nodeenv ✗ google-auth-oauthlib ✗ uritemplate ✓ fastjsonschema ✗ tokenizers ✗ google-auth-httplib2 ✗ build ✗ setuptools-scm ✓ google-cloud-aiplatform ✗ paramiko ✗ opentelemetry-exporter-otlp ✗ authlib ✗ pydantic-ai-slim ✓ httplib2 ✓ tiktoken ✓

Top 240 - 360

cloudpickle ✗ marshmallow ✓ traitlets ✓ pytest-xdist ✗ parso ✗ tornado ✗ opensearch-py ✓ sqlparse ✗ opentelemetry-util-http ✗ identify ✓ opentelemetry-instrumentation-requests ✗ jedi ✗ executing ✗ jsonpointer ✓ msal-extensions ✗ pre-commit ✓ cfgv ✓ execnet ✗ transformers ✓ grpc-google-iam-v1 ✗ aiofiles ✗ babel ✗ asttokens ✗ matplotlib-inline ✗ gunicorn ✓ requests-aws4auth ✗ google-cloud-secret-manager ✗ durationpy ✓ cython ✗ xxhash ✗ h2 ✗ tree-sitter-languages ✓ azure-storage-blob ✗ asgiref ✗ hyperframe ✗ hpack ✗ pure-eval ✗ stack-data ✗ xmltodict ✗ google-cloud-batch ✗ sentry-sdk ✗ importlib-resources ✓ nest-asyncio ✗ black ✓ py4j ✗ markdown ✓ anthropic ✗ weaviate-client ✓ webencodings ✓ langchain-core ✓ vcs-versioning ✓ events ✓ python-json-logger ✓ pyee ✗ databricks-sdk ✗ termcolor ✓ google-analytics-admin ✗ jsonschema-path ✓ cachecontrol ✓ datasets ✓ dbt-core ✓ debugpy ✗ playwright ✗ watchdog ✗ jsonpatch ✗ librt ✗ dbt-adapters ✓ pathable ✓ gcsfs ✓ pyzmq ✗ typing-inspect ✗ pyperclip ✗ pymongo ✗ google-cloud-compute ✗ jsonref ✓ google-cloud-kms ✗ aioitertools ✓ pandas-stubs ✓ pytest-mock ✗ databricks-sql-connector ✗ beartype ✓ fastmcp ✓ opensearch-protobufs ✓ dulwich ✓ grpcio-health-checking ✗ pycryptodome ✗ lz4 ✗ pymysql ✓ isort ✓ narwhals ✗ pkginfo ✗ flatbuffers ✓ cyclopts ✓ awswrangler ✓ slack-sdk ✗ jsonpath-ng ✓ ydb ✗ tinycss2 ✓ ujson ✓ google-cloud-dlp ✗ deepdiff ✓ msrest ✗ mccabe ✗ rich-rst ✗ dbt-common ✓ jupyter-core ✓ google-cloud-speech ✗ dataclasses-json ✗ pytest-json-ctrf ✓ rich-toolkit ✓ ipykernel ✓ poetry ✓ langsmith ✓ torch ✓ jupyter-client ✓ pygithub ✗ google-cloud-monitoring ✗ pymupdf ✓ rfc3339-validator ✓ invoke ✗

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.