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

Top 120 - 240

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

Top 240 - 360

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

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.