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

Top 120 - 240

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

Top 240 - 360

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

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.