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

Top 120 - 240

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

Top 240 - 360

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

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.