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

Top 120 - 240

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

Top 240 - 360

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

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.