What This Error Means
pip tried to write into a directory you don't have permission to modify (often system site-packages or a protected install directory).
How to Fix It
Preferred:install into a virtual environment and run pip from there.
If a venv isn't possible, use a user install when supported/appropriate:python -m pip install --user <package>
Avoid sudo pip ... unless you're intentionally managing a system Python and understand the risks.
Fix ownership/permissions if they were broken by running pip as a different user.
Why It Happens
You're installing into a system Python directory without root/admin privileges.
You activated the wrong environment (or didn't activate a venv).
A directory is owned by another user (common after using sudo pip ...).
On Windows, the target file is locked or the directory is protected.
How to Verify
Re-run the pip install and confirm it completes without permission errors.
Run python -m pip show <package> to confirm the package is installed in the expected environment.
Manual install target checks
Check where pip would install:python -m pip --version (shows python path) and python -c 'import site; print(site.getsitepackages())'
Confirm you're in the intended environment (venv/conda/system).
On Windows, close IDEs/terminals that might be using the Python install and retry.
Examples
ERROR: Could not install packages due to an OSError: [Errno 13] Permission denied: '/usr/local/locale'
ERROR: Could not install packages due to an OSError: [WinError 5] Access is denied: 'c:\\python311\\scripts\\pip.exe' Where pip installs packages
pip installs packages into the active Python environment's site-packages (or another target specified by flags).
If you're installing into a system Python location without appropriate permissions, writes fail with permission errors.
On Windows, access denied can also occur if files are locked by another process.
Prevention Tips
Use venvs for all projects and CI jobs.
Don't mix sudo and non-sudo installs into the same environment.
Keep system Python package management separate from project dependencies.
Where This Can Be Triggered
github.com/pypa/pip/blob/25.3/src/pip/_internal/commands/install.py
pip formats permission-related install failures in create_os_error_message() and adds an --user/permissions hint when errno is EACCES. - GitHub
def create_os_error_message(
error: OSError, show_traceback: bool, using_user_site: bool
) -> str:
"""Format an error message for an OSError
It may occur anytime during the execution of the install command.
"""
parts = []
# Mention the error if we are not going to show a traceback
parts.append("Could not install packages due to an OSError")
if not show_traceback:
parts.append(": ")
parts.append(str(error))
else:
parts.append(".")
# Spilt the error indication from a helper message (if any)
parts[-1] += "\n"
# Suggest useful actions to the user:
# (1) using user site-packages or (2) verifying the permissions
if error.errno == errno.EACCES:
user_option_part = "Consider using the `--user` option"
permissions_part = "Check the permissions"
if not running_under_virtualenv() and not using_user_site:
parts.extend(
[
user_option_part,
" or ",
permissions_part.lower(),
]
)
else:
parts.append(permissions_part)
parts.append(".\n")