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

Top 120 - 240

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

Top 240 - 360

asn1crypto ✗ mypy ✓ google-auth-oauthlib ✓ google-cloud-batch ✓ pyproject-hooks ✓ jedi ✓ httplib2 ✓ executing ✗ poetry-core ✓ parso ✗ jsonpointer ✓ sympy ✗ tree-sitter ✓ anthropic ✗ matplotlib-inline ✗ paramiko ✗ datasets ✓ build ✓ google-cloud-aiplatform ✓ asttokens ✗ fastjsonschema ✗ google-cloud-kms ✗ google-cloud-compute ✓ google-analytics-admin ✓ sentry-sdk ✗ mpmath ✗ azure-storage-blob ✗ sqlparse ✗ gcsfs ✓ stack-data ✗ aiofiles ✗ msal-extensions ✗ backoff ✗ pure-eval ✗ termcolor ✓ pytest-xdist ✗ cloudpickle ✗ black ✓ types-requests ✓ authlib ✓ marshmallow ✓ asgiref ✗ babel ✗ narwhals ✓ execnet ✗ gunicorn ✓ webencodings ✓ joserfc ✓ cython ✗ grpc-google-iam-v1 ✗ google-cloud-dlp ✓ jsonpatch ✗ databricks-sdk ✓ google-cloud-texttospeech ✗ durationpy ✓ pandas-stubs ✓ setuptools-scm ✓ xmltodict ✗ google-cloud-speech ✓ python-json-logger ✓ tornado ✗ rich-toolkit ✓ databricks-sql-connector ✗ mdit-py-plugins ✗ cachecontrol ✓ dbt-adapters ✓ google-cloud-pubsub ✓ librt ✗ pymongo ✗ markdown ✓ nest-asyncio ✗ linkify-it-py ✓ cbor2 ✓ watchdog ✗ opentelemetry-instrumentation-threading ✓ py4j ✗ uc-micro-py ✓ types-toml ✓ dbt-core ✓ importlib-resources ✓ isort ✓ asyncpg ✗ pytest-mock ✗ aioitertools ✓ tinycss2 ✓ llama-parse ✓ llama-cloud-services ✓ ghapi ✓ slack-sdk ✗ debugpy ✗ structlog ✓ pyperclip ✗ flatbuffers ✓ snowflake-snowpark-python ✗ pyzmq ✗ types-certifi ✓ google-cloud-tasks ✗ dulwich ✓ fastuuid ✗ grpclib ✓ google-cloud-monitoring ✓ vcs-versioning ✓ xlsxwriter ✗ jsonschema-path ✓ typing-inspect ✗ ruamel-yaml-clib ✗ lz4 ✗ torch ✓ python-docx ✗ pytokens ✗ langsmith ✓ msrest ✗ pypdf ✗ pkginfo ✗ sphinx ✓ pymupdf ✓ pycryptodome ✗ modal ✓ psycopg ✓ synchronicity ✓

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.