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

Top 120 - 240

exceptiongroup ✓ pynacl ✗ shellingham ✗ proto-plus ✗ sortedcontainers ✓ more-itertools ✗ google-cloud-storage ✗ psycopg2-binary ✗ websockets ✓ isodate ✗ networkx ✓ decorator ✗ mypy-extensions ✗ hatchling ✓ coverage ✓ msgpack ✓ scikit-learn ✓ azure-core ✗ opensearch-py ✓ huggingface-hub ✗ pexpect ✓ ptyprocess ✓ msal ✗ wcwidth ✗ azure-identity ✗ gitpython ✗ snowflake-connector-python ✗ joblib ✗ threadpoolctl ✗ requests-aws4auth ✗ distro ✗ bcrypt ✗ openai ✗ async-timeout ✓ dnspython ✓ python-multipart ✓ tabulate ✗ ruamel-yaml ✗ google-cloud-core ✗ asn1crypto ✗ smmap ✗ deprecated ✗ itsdangerous ✓ redis ✓ gitdb ✗ keyring ✓ poetry-core ✗ textual ✗ events ✓ pydantic-settings ✓ matplotlib ✓ alembic ✓ fonttools ✓ pytest-asyncio ✓ prompt-toolkit ✗ google-cloud-bigquery ✗ ruff ✗ tzlocal ✗ paramiko ✗ google-api-python-client ✗ jaraco-classes ✓ google-resumable-media ✗ kubernetes ✗ opentelemetry-instrumentation ✗ secretstorage ✓ typer ✗ blinker ✓ annotated-doc ✗ zstandard ✗ google-crc32c ✓ pyproject-hooks ✓ jiter ✗ jeepney ✓ chardet ✗ build ✗ kiwisolver ✓ google-auth-oauthlib ✗ pytest-cov ✗ types-requests ✓ nodeenv ✗ backoff ✗ langsmith ✓ setuptools-scm ✗ dill ✗ fastjsonschema ✗ rapidfuzz ✓ jaraco-context ✓ opensearch-protobufs ✓ msal-extensions ✗ jaraco-functools ✓ cloudpickle ✗ cycler ✗ langchain ✓ httplib2 ✓ prometheus-client ✗ uritemplate ✓ google-auth-httplib2 ✗ defusedxml ✗ identify ✓ gcsfs ✓ pre-commit ✓ orjson ✗ cfgv ✓ azure-storage-blob ✗ contourpy ✓ marshmallow ✓ sympy ✗ editables ✗ sqlparse ✗ aliyun-python-sdk-core ✗ google-cloud-secret-manager ✗ mako ✗ tokenizers ✗ opentelemetry-exporter-prometheus ✗ transformers ✗ ipython ✓ typedload ✓ cython ✗ docker ✗ google-cloud-batch ✗

Top 240 - 360

tornado ✗ mpmath ✗ importlib-resources ✓ xmltodict ✗ grpcio-health-checking ✗ py4j ✗ google-cloud-aiplatform ✗ traitlets ✓ google-analytics-admin ✗ babel ✗ uv ✗ jsonpointer ✗ email-validator ✗ jedi ✗ parso ✗ opentelemetry-util-http ✗ aiofiles ✗ mypy ✗ black ✓ hf-xet ✗ toml ✗ matplotlib-inline ✗ executing ✗ nest-asyncio ✗ asttokens ✗ ply ✓ opentelemetry-instrumentation-requests ✗ durationpy ✓ watchfiles ✗ asgiref ✗ grpc-google-iam-v1 ✗ sentry-sdk ✗ docstring-parser ✗ stack-data ✗ pure-eval ✗ botocore-stubs ✗ cachecontrol ✓ uvloop ✗ types-awscrt ✗ pandas-stubs ✓ webencodings ✓ langchain-core ✓ awswrangler ✓ tiktoken ✓ gunicorn ✗ python-json-logger ✗ markdown ✓ types-s3transfer ✗ pymongo ✗ boto3-stubs ✗ pytest-xdist ✗ termcolor ✓ pkginfo ✗ execnet ✗ dbt-core ✓ pyzmq ✗ typing-inspect ✗ dbt-adapters ✓ watchdog ✗ aioitertools ✓ httptools ✓ msrest ✗ ruamel-yaml-clib ✗ debugpy ✗ pymysql ✓ dbt-common ✓ jsonpatch ✗ jsonpath-ng ✗ snowflake-sqlalchemy ✗ databricks-sdk ✗ isort ✓ mcp ✓ mypy-boto3-s3 ✗ sphinx ✓ httpx-sse ✗ torch ✓ dulwich ✓ h2 ✗ hpack ✗ hyperframe ✗ pycryptodome ✗ pygithub ✗ poetry ✗ mccabe ✗ google-cloud-monitoring ✗ pysocks ✓ crashtest ✗ shapely ✓ sse-starlette ✗ slack-sdk ✗ datadog ✗ azure-common ✗ requests-file ✓ google-cloud-vision ✗ google-cloud-compute ✗ lz4 ✗ cleo ✗ installer ✓ litellm ✗ pytest-mock ✗ semver ✗ jupyter-core ✓ google-cloud-tasks ✗ google-cloud-speech ✗ dataclasses-json ✗ google-cloud-bigtable ✗ pendulum ✗ multiprocess ✗ google-cloud-dlp ✗ notebook ✗ rfc3339-validator ✓ google-cloud-kms ✗ argcomplete ✗ toolz ✗ backports-tarfile ✓ google-cloud-workflows ✗ smart-open ✗ ipykernel ✓ jupyter-client ✓ arrow ✗

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.