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

Top 120 - 240

proto-plus ✗ mypy-extensions ✗ werkzeug ✓ networkx ✓ websockets ✓ opentelemetry-exporter-otlp-proto-common ✗ psycopg2-binary ✗ more-itertools ✗ hatchling ✓ isodate ✗ pynacl ✗ coverage ✓ decorator ✗ huggingface-hub ✗ wcwidth ✗ python-multipart ✓ scikit-learn ✓ msgpack ✓ flask ✓ yandexcloud ✗ azure-core ✗ opentelemetry-exporter-otlp ✗ pexpect ✓ openai ✗ ptyprocess ✓ joblib ✗ distro ✗ msal ✗ annotated-doc ✗ kubernetes ✗ threadpoolctl ✗ dnspython ✓ bcrypt ✗ matplotlib ✓ snowflake-connector-python ✗ fonttools ✓ google-cloud-core ✗ redis ✓ ruamel-yaml ✗ async-timeout ✓ pydantic-settings ✓ gitpython ✗ poetry-core ✓ jiter ✗ asn1crypto ✗ tabulate ✗ azure-identity ✗ kiwisolver ✓ itsdangerous ✓ keyring ✓ types-requests ✓ ruff ✗ prompt-toolkit ✗ alembic ✓ deprecated ✗ google-resumable-media ✗ google-crc32c ✓ paramiko ✗ chardet ✗ cloudpickle ✗ tzlocal ✗ blinker ✓ smmap ✗ typer ✗ gitdb ✗ jaraco-classes ✓ prometheus-client ✗ secretstorage ✓ opentelemetry-instrumentation ✗ docker ✗ cycler ✗ google-api-python-client ✗ backoff ✗ jeepney ✓ orjson ✓ zstandard ✗ contourpy ✓ transformers ✓ editables ✗ rapidfuzz ✓ defusedxml ✗ pytest-cov ✗ sympy ✗ dill ✗ azure-storage-blob ✗ durationpy ✓ pyproject-hooks ✓ build ✗ fastjsonschema ✗ msal-extensions ✗ pytest-asyncio ✓ google-auth-oauthlib ✗ setuptools-scm ✗ jaraco-functools ✓ jaraco-context ✓ mpmath ✗ google-cloud-bigquery ✗ tokenizers ✗ uritemplate ✓ mako ✗ google-auth-httplib2 ✗ httplib2 ✓ babel ✗ marshmallow ✓ toml ✗ hf-xet ✗ textual ✗ sqlparse ✗ ipython ✓ nodeenv ✗ jsonpointer ✗ cython ✗ importlib-resources ✓ aiofiles ✗ xmltodict ✗ py4j ✗ traitlets ✓ gcsfs ✓ uv ✗ tornado ✗

Top 240 - 360

watchfiles ✗ pre-commit ✓ parso ✗ jedi ✗ opentelemetry-instrumentation-requests ✗ opentelemetry-util-http ✗ python-json-logger ✗ google-cloud-aiplatform ✗ mypy ✗ uvloop ✗ gunicorn ✓ email-validator ✗ identify ✓ docstring-parser ✗ matplotlib-inline ✗ nest-asyncio ✗ executing ✗ cfgv ✓ black ✓ asttokens ✗ langchain-core ✓ asgiref ✗ ply ✓ markdown ✓ dbt-core ✓ sentry-sdk ✗ grpc-google-iam-v1 ✗ webencodings ✓ tiktoken ✓ mcp ✓ httptools ✓ awswrangler ✓ typedload ✓ google-cloud-secret-manager ✗ torch ✓ stack-data ✗ cachecontrol ✓ pure-eval ✗ dbt-adapters ✓ pymysql ✓ httpx-sse ✗ wsproto ✓ pymongo ✗ databricks-sdk ✗ watchdog ✗ debugpy ✗ sse-starlette ✗ pysocks ✓ jsonpatch ✗ pkginfo ✗ termcolor ✓ aioitertools ✓ botocore-stubs ✗ types-awscrt ✗ typing-inspect ✗ pyzmq ✗ isort ✓ dbt-common ✓ msrest ✗ pytest-xdist ✗ jsonpath-ng ✗ ruamel-yaml-clib ✗ dulwich ✓ execnet ✗ boto3-stubs ✗ types-s3transfer ✗ pycryptodome ✗ h2 ✗ typer-slim ✗ nvidia-nccl-cu12 ✗ hyperframe ✗ hpack ✗ xxhash ✗ notebook ✗ poetry ✓ lz4 ✗ opentelemetry-exporter-prometheus ✗ selenium ✓ opensearch-py ✓ mccabe ✗ safetensors ✗ pytest-mock ✗ azure-common ✗ litellm ✗ multiprocess ✗ requests-aws4auth ✗ langsmith ✓ pendulum ✗ arrow ✗ slack-sdk ✗ jupyter-core ✓ ipykernel ✓ authlib ✗ crashtest ✗ deepdiff ✗ numba ✓ shapely ✓ aliyun-python-sdk-core ✗ requests-file ✓ trio ✓ cleo ✗ datadog ✗ poetry-plugin-export ✓ installer ✓ nvidia-cublas-cu12 ✗ mypy-boto3-s3 ✗ tinycss2 ✓ invoke ✗ croniter ✗ rfc3339-validator ✓ jupyter-client ✓ nvidia-cusparse-cu12 ✗ dataclasses-json ✗ narwhals ✗ pygithub ✗ snowflake-sqlalchemy ✗ pycodestyle ✓ toolz ✗ xlsxwriter ✗ grpcio-health-checking ✗

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.