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

Top 120 - 240

openai ✗ langchain ✓ google-genai ✓ werkzeug ✓ networkx ✓ mypy-extensions ✗ pyopenssl ✗ google-cloud-storage ✓ dnspython ✓ distro ✗ opentelemetry-proto ✗ coverage ✓ msgpack ✓ psycopg2-binary ✗ pynacl ✗ huggingface-hub ✓ fonttools ✓ decorator ✗ smmap ✗ opentelemetry-exporter-otlp-proto-http ✗ wcwidth ✗ sortedcontainers ✓ jiter ✗ watchfiles ✗ mcp ✓ tabulate ✓ pexpect ✓ matplotlib ✓ ptyprocess ✓ gitpython ✗ flask ✓ scikit-learn ✓ keyring ✓ isodate ✗ kiwisolver ✓ python-discovery ✗ sse-starlette ✓ redis ✓ docker ✗ jaraco-classes ✓ azure-identity ✗ google-cloud-core ✗ joblib ✗ opentelemetry-exporter-otlp-proto-grpc ✗ opentelemetry-exporter-otlp-proto-common ✗ secretstorage ✓ jeepney ✓ gitdb ✗ bcrypt ✗ azure-core ✗ contourpy ✓ itsdangerous ✓ opentelemetry-instrumentation ✗ ruff ✗ snowflake-connector-python ✗ jaraco-context ✓ threadpoolctl ✗ async-timeout ✓ google-cloud-aiplatform ✗ textual ✗ msal ✗ jaraco-functools ✓ editables ✗ prompt-toolkit ✗ docstring-parser ✗ alembic ✓ google-resumable-media ✗ email-validator ✗ google-crc32c ✓ pytest-cov ✗ cycler ✗ tzlocal ✗ zstandard ✗ multiprocess ✗ deprecated ✗ chardet ✓ orjson ✓ dill ✗ ruamel-yaml ✗ defusedxml ✗ blinker ✓ hf-xet ✗ types-requests ✓ kubernetes ✗ poetry-core ✓ uv ✗ asn1crypto ✗ pytest-asyncio ✓ google-api-python-client ✗ google-auth-oauthlib ✗ sympy ✗ setuptools-scm ✓ mako ✗ ipython ✓ httpx-sse ✗ rapidfuzz ✓ backoff ✗ prometheus-client ✗ mpmath ✗ google-auth-httplib2 ✗ paramiko ✗ google-cloud-bigquery ✗ tokenizers ✗ sglang ✓ uritemplate ✓ litellm ✗ pyproject-hooks ✓ tiktoken ✓ toml ✗ uvloop ✗ marshmallow ✓ transformers ✓ httplib2 ✓ nodeenv ✗ build ✗ cloudpickle ✗ opentelemetry-exporter-otlp ✗ sqlparse ✗ databricks-sdk ✗ fastjsonschema ✗

Top 240 - 360

mypy ✓ msal-extensions ✗ pydantic-ai-slim ✓ jsonpointer ✓ identify ✓ parso ✗ opentelemetry-instrumentation-requests ✗ httptools ✓ traitlets ✓ google-cloud-secret-manager ✗ pre-commit ✓ cfgv ✓ babel ✗ executing ✗ jedi ✗ opentelemetry-util-http ✗ durationpy ✓ gunicorn ✓ google-cloud-batch ✗ azure-storage-blob ✗ grpc-google-iam-v1 ✗ tree-sitter ✓ asttokens ✗ xxhash ✗ google-analytics-admin ✗ tornado ✗ authlib ✗ aiofiles ✗ matplotlib-inline ✗ cython ✗ black ✓ vcs-versioning ✓ h2 ✗ py4j ✗ hyperframe ✗ hpack ✗ langchain-core ✓ xmltodict ✗ pure-eval ✗ stack-data ✗ importlib-resources ✓ asgiref ✗ pytest-xdist ✗ sentry-sdk ✗ termcolor ✓ python-json-logger ✓ markdown ✓ execnet ✗ weaviate-client ✓ webencodings ✓ nest-asyncio ✗ cachecontrol ✓ dbt-core ✓ typing-inspect ✗ anthropic ✗ datasets ✓ pandas-stubs ✓ pytest-json-ctrf ✓ jsonpatch ✗ pydantic-graph ✓ pymongo ✗ grpcio-health-checking ✗ jsonschema-path ✓ dbt-adapters ✓ awswrangler ✓ pymysql ✓ debugpy ✗ aioitertools ✓ watchdog ✗ tree-sitter-languages ✓ lz4 ✗ torch ✓ databricks-sql-connector ✗ pathable ✓ dataclasses-json ✗ pyzmq ✗ pyperclip ✗ pycryptodome ✗ gcsfs ✓ dulwich ✓ pytest-mock ✗ slack-sdk ✗ isort ✓ jsonpath-ng ✓ rich-toolkit ✓ pkginfo ✗ google-cloud-monitoring ✗ flatbuffers ✓ pymupdf ✓ typedload ✓ langsmith ✓ deepdiff ✓ google-cloud-compute ✗ dbt-common ✓ pygithub ✗ msrest ✗ google-cloud-kms ✗ mccabe ✗ google-cloud-speech ✗ smart-open ✓ tinycss2 ✓ sphinx ✓ narwhals ✗ librt ✗ beartype ✓ xlsxwriter ✗ jsonref ✓ poetry ✓ pendulum ✗ google-cloud-vision ✗ notebook ✗ rfc3339-validator ✓ loguru ✗ google-cloud-tasks ✗ google-cloud-bigtable ✗ google-cloud-dlp ✗ semver ✗ ruamel-yaml-clib ✗ cattrs ✓ invoke ✗

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.