pip couldn't find ANY version of that package for your interpreter. It's almost never 'the package doesn't exist': typo, wrong index, unsupported Python version, or an offline/filtered network.
Package names are exact (no 'py' prefixes — bs4 vs beautifulsoup4). '(from versions: none)' = the index pip reached has no such name: check the right index for private packages (index-url/extra-index-url).
Old Python (3.6) or bleeding-edge (3.13 pre-support): releases exist but none match your interpreter — pip filters them all out. python --version vs the package's classifiers decides.
Corporate proxies, firewalled CI, or pip.conf pointing at a mirror that lacks the package. pip config list + curl -sI https://pypi.org exposes it.
pip index versions <pkg> 2>/dev/null || pip install <pkg>==99999 # error lists real versions (or confirms none exist)
pip config list ; python --version ; pip --version
pip install <pkg> --index-url https://pypi.example.com/simple/ # or env PIP_INDEX_URL in CI
curl -sI --max-time 5 https://pypi.org/simple/ | head -1
'(from versions: none)' vs '(from versions: 1.0, 1.2)' is the key read: none = wrong index/typo/network; a version list = your constraints/interpreter exclude them all. requirements.txt typos survive for ages because installs are cached — pin names exactly as they appear on PyPI.
Then it's the interpreter or the index: no release supports your Python version (older or newer than the wheels), or pip is pointed at a different index (pip config list). The 'from versions' clause tells you which.
pip install 'pkg==nonexistent-version' — the error enumerates every version visible to your pip for that interpreter. Empty list confirms the index/name problem.
Our most-documented failures, packaged as ready-to-ship starter kits: Docker, Kubernetes, and Terraform.
Browse the template store →One-time. Yours to modify. Instant download from the NinjaOps template store.