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

Top 120 - 240

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

Top 240 - 360

pexpect ✓ httplib2 ✓ black ✓ rapidfuzz ✓ snowflake-connector-python ✓ narwhals ✓ pypdf ✗ aiofiles ✗ pytest-xdist ✗ msal-extensions ✗ sqlparse ✓ databricks-sdk ✓ execnet ✗ cloudpickle ✗ datasets ✓ paramiko ✗ librt ✗ psycopg ✓ traitlets ✓ webencodings ✓ asgiref ✓ fastjsonschema ✓ awscli ✓ ipython ✓ opentelemetry-exporter-otlp ✓ opentelemetry-instrumentation-threading ✓ jsonpatch ✗ psycopg-binary ✓ gunicorn ✓ grpc-google-iam-v1 ✓ authlib ✓ google-cloud-secret-manager ✓ babel ✗ azure-storage-blob ✗ executing ✗ isort ✓ pyproject-hooks ✓ joserfc ✓ setuptools-scm ✗ poetry-core ✓ asyncpg ✗ ydb ✓ markdown ✓ asttokens ✗ parso ✗ jedi ✓ marshmallow ✓ vcs-versioning ✗ build ✓ xmltodict ✗ tornado ✗ langsmith ✓ cython ✗ python-docx ✗ matplotlib-inline ✗ structlog ✓ python-json-logger ✓ cachecontrol ✓ pydantic-ai-slim ✓ stack-data ✗ pure-eval ✗ watchdog ✗ tinycss2 ✓ playwright ✓ gcsfs ✓ safetensors ✓ pyzmq ✓ aioitertools ✓ xlsxwriter ✗ typedload ✓ pyee ✓ google-cloud-batch ✓ nest-asyncio ✗ pymysql ✓ fastuuid ✗ pymupdf ✓ kubernetes ✓ lz4 ✗ py4j ✗ google-cloud-aiplatform ✓ awswrangler ✓ pytest-mock ✗ pytokens ✗ termcolor ✓ wsproto ✓ debugpy ✗ reportlab ✓ brotli ✓ pytest-timeout ✗ pydantic-graph ✓ google-cloud-kms ✓ cbor2 ✓ sqlglot ✓ flatbuffers ✓ jupyter-core ✓ pymongo ✗ google-cloud-pubsub ✓ croniter ✗ slack-sdk ✗ google-cloud-compute ✓ loguru ✗ deprecation ✓ uuid-utils ✓ google-analytics-admin ✓ pycryptodome ✗ importlib-resources ✓ torch ✓ xlrd ✗ typing-inspect ✗ nbformat ✓ tomli-w ✓ opentelemetry-instrumentation-fastapi ✓ graphql-core ✗ types-toml ✓ ast-serialize ✗ google-cloud-logging ✓ invoke ✗ griffelib ✓ jupyter-client ✓ pyperclip ✗

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.