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

Top 120 - 240

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

Top 240 - 360

mypy ✗ cfgv ✓ xmltodict ✗ uvloop ✗ opentelemetry-instrumentation-requests ✗ google-cloud-secret-manager ✗ opentelemetry-util-http ✗ tornado ✗ traitlets ✓ mpmath ✗ jedi ✗ black ✓ gunicorn ✓ cython ✗ opensearch-py ✓ py4j ✗ importlib-resources ✓ toml ✗ executing ✗ matplotlib-inline ✗ asgiref ✗ asttokens ✗ tiktoken ✓ nest-asyncio ✗ cachecontrol ✓ markdown ✓ httptools ✓ mcp ✓ requests-aws4auth ✗ ply ✓ grpc-google-iam-v1 ✗ langchain-core ✓ aliyun-python-sdk-core ✗ google-cloud-batch ✗ sentry-sdk ✗ opentelemetry-exporter-prometheus ✗ grpcio-health-checking ✗ stack-data ✗ pure-eval ✗ webencodings ✓ httpx-sse ✗ dbt-core ✓ awswrangler ✓ pytest-xdist ✗ pymongo ✗ execnet ✗ pkginfo ✗ sse-starlette ✗ google-analytics-admin ✗ termcolor ✓ watchdog ✗ dulwich ✓ pymysql ✓ jsonpatch ✗ isort ✓ authlib ✗ typing-inspect ✗ databricks-sdk ✗ debugpy ✗ aioitertools ✓ croniter ✗ dbt-adapters ✓ typer-slim ✗ typedload ✓ pyzmq ✗ ruamel-yaml-clib ✗ pycryptodome ✗ poetry ✓ h2 ✗ msrest ✗ litellm ✗ hyperframe ✗ hpack ✗ events ✓ pytest-mock ✗ jsonpath-ng ✗ pandas-stubs ✓ xxhash ✗ mccabe ✗ botocore-stubs ✗ dbt-common ✓ types-awscrt ✗ torch ✓ cleo ✗ installer ✓ boto3-stubs ✗ lz4 ✗ crashtest ✗ types-s3transfer ✗ slack-sdk ✗ dataclasses-json ✗ poetry-plugin-export ✓ datasets ✗ portalocker ✗ argcomplete ✗ snowflake-sqlalchemy ✗ notebook ✗ pygithub ✗ pendulum ✗ ipykernel ✓ jupyter-core ✓ multiprocess ✗ deepdiff ✗ arrow ✗ pycodestyle ✓ azure-common ✗ invoke ✗ datadog ✗ rfc3339-validator ✓ inspect-ai ✓ langsmith ✓ smart-open ✗ sphinx ✓ semver ✗ jupyter-client ✓ loguru ✗ shapely ✓ numba ✓ text-unidecode ✓ wsproto ✓

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.