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

Top 120 - 240

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

Top 240 - 360

ydb ✗ google-cloud-bigquery ✗ jsonpointer ✓ sympy ✗ google-cloud-batch ✗ aiofiles ✗ traitlets ✓ transformers ✓ fastjsonschema ✗ types-requests ✓ marshmallow ✓ backoff ✗ weaviate-client ✓ sqlparse ✗ msal-extensions ✗ jedi ✓ parso ✗ mpmath ✗ azure-storage-blob ✗ identify ✓ dbt-core ✓ pre-commit ✓ executing ✗ setuptools-scm ✓ ujson ✓ babel ✗ gunicorn ✓ cfgv ✓ matplotlib-inline ✗ google-analytics-admin ✗ anthropic ✗ sentry-sdk ✗ durationpy ✓ grpc-google-iam-v1 ✗ cloudpickle ✗ asttokens ✗ h2 ✗ google-cloud-kms ✗ google-cloud-compute ✗ asgiref ✗ hyperframe ✗ nest-asyncio ✗ hpack ✗ databricks-sdk ✓ webencodings ✓ tornado ✗ xmltodict ✗ pytest-xdist ✗ gcsfs ✓ cython ✗ authlib ✓ stack-data ✗ pure-eval ✗ dacite ✗ datasets ✓ black ✓ execnet ✗ librt ✗ langchain-core ✓ py4j ✗ jsonpatch ✗ pandas-stubs ✓ python-json-logger ✓ cachecontrol ✓ google-cloud-dlp ✗ iso8601 ✗ markdown ✓ importlib-resources ✓ pyzmq ✗ vcs-versioning ✓ google-cloud-speech ✗ watchdog ✗ pymongo ✗ pyhumps ✗ debugpy ✗ google-cloud-pubsub ✗ typing-inspect ✗ termcolor ✓ llama-parse ✓ joserfc ✗ llama-cloud-services ✓ google-cloud-texttospeech ✗ dbt-adapters ✓ axiom-py ✗ aioitertools ✓ rich-toolkit ✓ tinycss2 ✓ isort ✓ pymysql ✓ pytest-mock ✗ dulwich ✓ structlog ✗ pycryptodome ✗ asyncpg ✗ lz4 ✗ slack-sdk ✗ narwhals ✗ jupyter-core ✓ google-cloud-tasks ✗ pkginfo ✗ msrest ✗ dbt-common ✓ pywin32 ✗ ruamel-yaml-clib ✗ grpcio-health-checking ✗ google-cloud-monitoring ✗ jupyter-client ✓ loguru ✗ google-cloud-bigtable ✗ dataclasses-json ✗ langsmith ✓ google-cloud-logging ✗ torch ✓ awswrangler ✓ deepdiff ✓ ipykernel ✓ flatbuffers ✓ invoke ✗ google-cloud-vision ✗ poetry ✓

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.