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

Top 120 - 240

flask ✓ werkzeug ✓ proto-plus ✗ pydantic-settings ✓ langchain ✓ pyopenssl ✗ mypy-extensions ✗ google-cloud-storage ✗ openai ✗ coverage ✓ dnspython ✓ pynacl ✗ psycopg2-binary ✗ opentelemetry-exporter-otlp-proto-http ✗ distro ✗ python-multipart ✓ opentelemetry-exporter-otlp-proto-grpc ✗ isodate ✗ networkx ✓ scikit-learn ✓ keyring ✓ sortedcontainers ✓ opentelemetry-exporter-otlp-proto-common ✗ wcwidth ✗ matplotlib ✓ fonttools ✓ google-cloud-aiplatform ✗ decorator ✗ huggingface-hub ✗ jaraco-classes ✓ secretstorage ✓ azure-core ✗ azure-identity ✗ ruff ✗ tabulate ✓ textual ✗ jeepney ✓ joblib ✗ bcrypt ✗ redis ✓ editables ✗ gitpython ✗ msal ✗ jiter ✗ kiwisolver ✓ jaraco-context ✓ yandexcloud ✗ zstandard ✗ jaraco-functools ✓ types-requests ✓ watchfiles ✗ itsdangerous ✓ pexpect ✓ ptyprocess ✓ defusedxml ✗ threadpoolctl ✗ ruamel-yaml ✗ snowflake-connector-python ✗ google-cloud-core ✗ poetry-core ✓ contourpy ✓ async-timeout ✓ alembic ✓ rapidfuzz ✓ deprecated ✗ smmap ✗ email-validator ✗ python-discovery ✗ pytest-cov ✗ gitdb ✗ opentelemetry-instrumentation ✗ prompt-toolkit ✗ orjson ✓ google-crc32c ✓ blinker ✓ kubernetes ✗ google-resumable-media ✗ docker ✗ google-api-python-client ✗ pytest-asyncio ✓ tzlocal ✗ paramiko ✗ asn1crypto ✗ sentry-sdk ✗ uv ✗ sse-starlette ✓ chardet ✓ docstring-parser ✗ google-cloud-bigquery ✗ pyproject-hooks ✓ backoff ✗ prometheus-client ✗ opentelemetry-exporter-otlp ✗ sympy ✗ cycler ✗ mako ✗ setuptools-scm ✗ build ✗ google-auth-oauthlib ✗ fastjsonschema ✗ marshmallow ✓ dill ✗ uritemplate ✓ httplib2 ✓ google-auth-httplib2 ✗ sqlparse ✗ msal-extensions ✗ mcp ✓ opensearch-py ✓ uvloop ✗ azure-storage-blob ✗ mpmath ✗ mypy ✗ transformers ✓ jsonpointer ✗ hf-xet ✗ babel ✗ xmltodict ✗ google-cloud-secret-manager ✗ requests-aws4auth ✗

Top 240 - 360

tokenizers ✗ nodeenv ✗ ipython ✓ google-cloud-batch ✗ httpx-sse ✗ aiofiles ✗ black ✓ gcsfs ✓ opentelemetry-util-http ✗ cloudpickle ✗ httptools ✓ asgiref ✗ databricks-sdk ✗ tornado ✗ gunicorn ✓ google-analytics-admin ✗ toml ✗ authlib ✗ tiktoken ✓ parso ✗ opentelemetry-instrumentation-requests ✗ pre-commit ✓ traitlets ✓ importlib-resources ✓ identify ✓ executing ✗ jedi ✗ grpcio-health-checking ✗ py4j ✗ isort ✓ markdown ✓ events ✓ cython ✗ durationpy ✓ pytest-xdist ✗ asttokens ✗ litellm ✗ cfgv ✓ langchain-core ✓ cachecontrol ✓ webencodings ✓ matplotlib-inline ✗ execnet ✗ python-json-logger ✗ grpc-google-iam-v1 ✗ dbt-core ✓ nest-asyncio ✗ pydantic-ai-slim ✓ stack-data ✗ typing-inspect ✗ pure-eval ✗ jsonpatch ✗ typedload ✓ pandas-stubs ✓ aliyun-python-sdk-core ✗ pymongo ✗ cattrs ✓ xxhash ✗ jsonschema-path ✓ termcolor ✓ watchdog ✗ aioitertools ✓ debugpy ✗ h2 ✗ awswrangler ✓ pkginfo ✗ hyperframe ✗ hpack ✗ dulwich ✓ dbt-adapters ✓ pytest-mock ✗ pymysql ✓ opensearch-protobufs ✓ dataclasses-json ✗ pyzmq ✗ jsonpath-ng ✓ msrest ✗ torch ✓ slack-sdk ✗ dbt-common ✓ pyperclip ✗ invoke ✗ ruamel-yaml-clib ✗ pycryptodome ✗ tree-sitter ✓ pathable ✓ poetry ✓ pygithub ✗ pydantic-graph ✓ lz4 ✗ mccabe ✗ semver ✗ rfc3339-validator ✓ rich-toolkit ✓ portalocker ✗ langsmith ✓ deepdiff ✗ tinycss2 ✓ databricks-sql-connector ✗ google-cloud-monitoring ✗ installer ✓ sphinx ✓ cleo ✗ google-cloud-speech ✗ arrow ✗ crashtest ✗ google-cloud-compute ✗ google-cloud-kms ✗ anthropic ✗ google-cloud-vision ✗ smart-open ✓ multiprocess ✗ pendulum ✗ future ✗ notebook ✗ argcomplete ✗ google-cloud-tasks ✗ croniter ✗ librt ✗ azure-common ✗

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.