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

Top 120 - 240

multiprocess ✗ more-itertools ✓ docutils ✗ google-cloud-storage ✓ openpyxl ✗ tomlkit ✗ et-xmlfile ✗ huggingface-hub ✓ requests-toolbelt ✗ gitpython ✗ mypy-extensions ✗ grpcio-tools ✓ wcwidth ✗ werkzeug ✓ networkx ✓ editables ✗ docker ✗ langchain ✓ watchfiles ✗ opentelemetry-exporter-otlp-proto-http ✗ ptyprocess ✓ pyopenssl ✗ smmap ✗ decorator ✗ msgpack ✓ pexpect ✓ python-discovery ✗ matplotlib ✓ psycopg2-binary ✗ dnspython ✓ coverage ✓ fonttools ✓ pynacl ✗ mcp ✓ google-cloud-core ✗ sortedcontainers ✓ kiwisolver ✓ tabulate ✓ opentelemetry-instrumentation ✗ gitdb ✗ scikit-learn ✓ google-genai ✓ opentelemetry-exporter-otlp-proto-common ✗ docstring-parser ✗ opentelemetry-exporter-otlp-proto-grpc ✗ contourpy ✓ prompt-toolkit ✗ flask ✓ hf-xet ✗ google-crc32c ✓ google-resumable-media ✗ itsdangerous ✓ pydantic-ai-slim ✓ sse-starlette ✓ dill ✗ isodate ✗ joblib ✗ ruff ✗ keyring ✓ redis ✓ chardet ✓ tokenizers ✓ async-timeout ✓ bcrypt ✗ azure-identity ✗ toml ✗ threadpoolctl ✗ cycler ✗ azure-core ✓ jaraco-classes ✓ jeepney ✓ secretstorage ✓ orjson ✓ blinker ✓ kubernetes ✗ alembic ✓ transformers ✓ zstandard ✗ msal ✗ snowflake-connector-python ✗ pytest-asyncio ✓ pytest-cov ✗ ipython ✓ jaraco-context ✓ deprecated ✗ ruamel-yaml ✗ tzlocal ✗ jaraco-functools ✓ defusedxml ✗ xxhash ✗ google-cloud-bigquery ✗ tiktoken ✓ nodeenv ✗ email-validator ✗ mako ✗ google-api-python-client ✗ uv ✗ uvloop ✗ mypy ✓ traitlets ✓ asn1crypto ✗ httptools ✓ rapidfuzz ✓ identify ✓ parso ✗ pre-commit ✓ google-auth-oauthlib ✗ databricks-sql-connector ✗ jedi ✓ pytest-json-ctrf ✓ executing ✗ httpx-sse ✗ prometheus-client ✗ cfgv ✓ uritemplate ✓ grpc-google-iam-v1 ✗ h2 ✗ sympy ✗ hyperframe ✗ paramiko ✗

Top 240 - 360

google-auth-httplib2 ✗ hpack ✗ asttokens ✗ matplotlib-inline ✗ pyproject-hooks ✓ google-cloud-aiplatform ✓ poetry-core ✓ httplib2 ✓ opentelemetry-instrumentation-requests ✗ datasets ✓ mpmath ✗ opentelemetry-exporter-otlp ✗ opentelemetry-util-http ✗ build ✓ pure-eval ✗ stack-data ✗ backoff ✗ durationpy ✓ setuptools-scm ✓ aiofiles ✗ types-requests ✓ google-cloud-secret-manager ✗ sqlparse ✗ fastjsonschema ✗ marshmallow ✓ cloudpickle ✗ termcolor ✓ jsonpointer ✓ msal-extensions ✗ tree-sitter ✓ pytest-xdist ✗ google-cloud-batch ✗ anthropic ✗ azure-storage-blob ✗ gunicorn ✓ babel ✗ execnet ✗ py4j ✗ weaviate-client ✓ tornado ✗ cython ✗ markdown ✓ asgiref ✗ sentry-sdk ✗ xmltodict ✗ ydb ✗ nest-asyncio ✗ webencodings ✓ librt ✗ databricks-sdk ✓ vcs-versioning ✓ google-analytics-admin ✗ authlib ✓ black ✓ google-cloud-compute ✗ dbt-core ✓ gcsfs ✓ importlib-resources ✓ google-cloud-kms ✗ cachecontrol ✓ pyzmq ✗ python-json-logger ✓ pydantic-graph ✓ debugpy ✗ langchain-core ✓ jsonpatch ✗ pymongo ✗ typing-inspect ✗ watchdog ✗ google-cloud-pubsub ✗ google-cloud-dlp ✗ aioitertools ✓ google-cloud-speech ✗ joserfc ✗ slack-sdk ✗ lz4 ✗ flatbuffers ✓ dulwich ✓ pytest-mock ✗ dbt-adapters ✓ pycryptodome ✗ pandas-stubs ✓ safetensors ✗ tinycss2 ✓ awswrangler ✓ torch ✓ google-cloud-texttospeech ✗ jsonschema-path ✓ pymysql ✓ pymupdf ✓ cbor2 ✓ msrest ✗ pkginfo ✗ jupyter-core ✓ tree-sitter-languages ✓ deepdiff ✓ isort ✓ typedload ✓ narwhals ✗ google-cloud-monitoring ✗ xlsxwriter ✗ dataclasses-json ✗ google-cloud-logging ✗ asyncpg ✗ jupyter-client ✓ mdit-py-plugins ✗ cyclopts ✓ invoke ✗ types-toml ✓ dbt-common ✓ grpcio-health-checking ✗ semver ✗ rich-toolkit ✓ ipykernel ✓ langsmith ✓ cattrs ✓ structlog ✗ google-cloud-tasks ✗ loguru ✗ 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.