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

Top 120 - 240

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

Top 240 - 360

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

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.