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

Top 120 - 240

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

Top 240 - 360

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

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.