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

Top 120 - 240

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

Top 240 - 360

ipython ✓ mypy ✗ google-cloud-secret-manager ✗ mcp ✓ grpcio-health-checking ✗ mpmath ✗ parso ✗ opentelemetry-util-http ✗ traitlets ✓ tornado ✗ google-cloud-batch ✗ pre-commit ✓ tiktoken ✓ gunicorn ✓ cloudpickle ✗ black ✓ jedi ✗ cython ✗ httpx-sse ✗ executing ✗ py4j ✗ toml ✗ opentelemetry-instrumentation-requests ✗ importlib-resources ✓ authlib ✗ google-analytics-admin ✗ httptools ✓ asgiref ✗ sse-starlette ✓ identify ✓ cattrs ✓ asttokens ✗ durationpy ✓ cfgv ✓ langchain-core ✓ litellm ✗ sentry-sdk ✗ matplotlib-inline ✗ markdown ✓ cachecontrol ✓ opentelemetry-exporter-prometheus ✗ aliyun-python-sdk-core ✗ python-json-logger ✗ typedload ✓ grpc-google-iam-v1 ✗ databricks-sdk ✗ nest-asyncio ✗ pytest-xdist ✗ webencodings ✓ stack-data ✗ pure-eval ✗ dbt-core ✓ execnet ✗ jsonpatch ✗ pymongo ✗ xxhash ✗ requests-file ✓ pandas-stubs ✓ typing-inspect ✗ portalocker ✗ debugpy ✗ aioitertools ✓ watchdog ✗ dulwich ✓ jsonschema-path ✓ pkginfo ✗ pymysql ✓ h2 ✗ termcolor ✓ hyperframe ✗ typer-slim ✓ hpack ✗ awswrangler ✓ dbt-adapters ✓ pytest-mock ✗ pyzmq ✗ ruamel-yaml-clib ✗ poetry ✓ dataclasses-json ✗ msrest ✗ lz4 ✗ mccabe ✗ pyperclip ✗ pathable ✓ semver ✗ pylint ✓ invoke ✗ langsmith ✓ pywin32 ✗ pycryptodome ✗ databricks-sql-connector ✗ slack-sdk ✗ rfc3339-validator ✓ dbt-common ✓ argcomplete ✗ torch ✓ smart-open ✓ deepdiff ✗ snowflake-sqlalchemy ✗ pygithub ✗ installer ✓ cleo ✗ rich-toolkit ✓ crashtest ✗ tinycss2 ✓ sphinx ✓ arrow ✗ google-cloud-monitoring ✗ pendulum ✗ multiprocess ✗ jupyter-core ✓ google-cloud-vision ✗ google-cloud-speech ✗ google-cloud-kms ✗ notebook ✗ google-cloud-compute ✗ pycodestyle ✓ beartype ✓ datadog ✗ ipykernel ✓

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.