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

Top 120 - 240

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

Top 240 - 360

databricks-sql-connector ✗ h2 ✗ google-auth-httplib2 ✗ poetry-core ✓ paramiko ✗ hyperframe ✗ hpack ✗ types-requests ✓ pyproject-hooks ✓ pytest-json-ctrf ✓ opentelemetry-instrumentation-requests ✗ grpc-google-iam-v1 ✗ httplib2 ✓ mpmath ✗ sqlparse ✗ build ✓ fastjsonschema ✗ mypy ✓ cloudpickle ✗ datasets ✓ opentelemetry-util-http ✗ backoff ✗ aiofiles ✗ jsonpointer ✓ opentelemetry-exporter-otlp ✗ tree-sitter ✓ termcolor ✓ marshmallow ✓ google-cloud-secret-manager ✗ msal-extensions ✗ babel ✗ tornado ✗ anthropic ✗ vcs-versioning ✓ markdown ✓ cython ✗ asgiref ✗ gunicorn ✓ azure-storage-blob ✗ pytest-xdist ✗ sentry-sdk ✗ py4j ✗ webencodings ✓ execnet ✗ xmltodict ✗ nest-asyncio ✗ google-cloud-batch ✗ weaviate-client ✓ databricks-sdk ✓ authlib ✓ black ✓ python-json-logger ✓ pyzmq ✗ debugpy ✗ cachecontrol ✓ importlib-resources ✓ dbt-core ✓ ydb ✗ langchain-core ✓ jsonpatch ✗ gcsfs ✓ google-analytics-admin ✗ google-cloud-compute ✗ tree-sitter-languages ✓ pymongo ✗ watchdog ✗ google-cloud-kms ✗ typing-inspect ✗ librt ✗ awswrangler ✓ safetensors ✗ dulwich ✓ pytest-mock ✗ lz4 ✗ aioitertools ✓ tinycss2 ✓ joserfc ✗ google-cloud-pubsub ✗ flatbuffers ✓ jupyter-core ✓ dbt-adapters ✓ torch ✓ pymupdf ✓ narwhals ✗ google-cloud-dlp ✗ slack-sdk ✗ cyclopts ✓ jsonschema-path ✓ cbor2 ✓ jupyter-client ✓ pkginfo ✗ google-cloud-speech ✗ pymysql ✓ ipykernel ✓ pycryptodome ✗ types-pyyaml ✓ rfc3339-validator ✓ isort ✓ rich-rst ✗ deepdiff ✓ msrest ✗ comm ✓ xlsxwriter ✗ arrow ✗ typedload ✓ invoke ✗ langsmith ✓ dbt-common ✓ pydantic-graph ✓ poetry ✓ asyncpg ✗ google-cloud-resource-manager ✗ google-cloud-texttospeech ✗ shapely ✓ dataclasses-json ✗ google-cloud-logging ✗ structlog ✗ pandas-stubs ✓ loguru ✗ semver ✗

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.