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

Top 120 - 240

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

Top 240 - 360

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

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.