Solving problem is about exposing yourself to as many situations as possible like pip install failing with: OSError: [Errno 13] Permission denied on directory and practice these strategies over and over. With time, it becomes second nature and a natural way you approach any problems in general. Big or small, always start with a plan, use other strategies mentioned here till you are confident and ready to code the solution.
In this post, my aim is to share an overview the topic about pip install failing with: OSError: [Errno 13] Permission denied on directory, which can be followed any time. Take easy to follow this discuss.
pip install -r requirements.txt fails with the exception below
OSError: [Errno 13] Permission denied: '/usr/local/lib/.... What’s wrong and how do I fix this? (I am trying to setup Django)
Installing collected packages: amqp, anyjson, arrow, beautifulsoup4, billiard, boto, braintree, celery, cffi, cryptography, Django, django-bower, django-braces, django-celery, django-crispy-forms, django-debug-toolbar, django-disqus, django-embed-video, django-filter, django-merchant, django-pagination, django-payments, django-storages, django-vote, django-wysiwyg-redactor, easy-thumbnails, enum34, gnureadline, idna, ipaddress, ipython, kombu, mock, names, ndg-httpsclient, Pillow, pyasn1, pycparser, pycrypto, PyJWT, pyOpenSSL, python-dateutil, pytz, requests, six, sqlparse, stripe, suds-jurko Cleaning up... Exception: Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 122, in main status = self.run(options, args) File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 283, in run requirement_set.install(install_options, global_options, root=options.root_path) File "/usr/lib/python2.7/dist-packages/pip/req.py", line 1436, in install requirement.install(install_options, global_options, *args, **kwargs) File "/usr/lib/python2.7/dist-packages/pip/req.py", line 672, in install self.move_wheel_files(self.source_dir, root=root) File "/usr/lib/python2.7/dist-packages/pip/req.py", line 902, in move_wheel_files pycompile=self.pycompile, File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 206, in move_wheel_files clobber(source, lib_dir, True) File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 193, in clobber os.makedirs(destsubdir) File "/usr/lib/python2.7/os.py", line 157, in makedirs mkdir(name, mode) OSError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/amqp-1.4.6.dist-info'
Option a) Create a virtualenv, activate it and install:
virtualenv .venv source .venv/bin/activate pip install -r requirements.txt
Option b) Install in your homedir:
pip install --user -r requirements.txt
My recommendation use safe (a) option, so that requirements of this project do not interfere with other projects requirements.
We should really stop advising the use of
pip install. It’s better to first try
pip install --user. If this fails then take a look at the top post here.
The reason you shouldn’t use
sudo is as follows:
When you run pip with
sudo, you are running arbitrary Python code from the Internet as a root user, which is quite a big security risk. If someone puts up a malicious project on PyPI and you install it, you give an attacker root access to your machine.
You are trying to install a package on the system-wide path without having the permission to do so.
In general, you can use
sudoto temporarily obtain superuser
permissions at your responsibility in order to install the package on the system-wide path:
sudo pip install -r requirements.txt
Find more about
Actually, this is a bad idea and there’s no good use case for it, see @wim’s comment.
If you don’t want to make system-wide changes, you can install the package on your per-user path using the
All it takes is:
pip install --user runloop requirements.txt
Finally, for even finer grained control, you can also use a virtualenv, which might be the superior solution for a development environment, especially if you are working on multiple projects and want to keep track of each one’s dependencies.
After activating your virtualenv with
the following command will install the package inside the virtualenv (and not on the system-wide path):
pip install -r requirements.txt
Just clarifying what worked for me after much pain in linux (ubuntu based) on permission denied errors, and leveraging from Bert’s answer above, I now use …
$ pip install --user <package-name>
or if running pip on a requirements file …
$ pip install --user -r requirements.txt
and these work reliably for every pip install including creating virtual environments.
However, the cleanest solution in my further experience has been to install
sudo apt-get install at the system level.
Then, inside virtual environments, use
pip install without the
--user flag AND without
sudo. Much cleaner, safer, and easier overall.
User doesn’t have write permission for some Python installation paths. You can give the permission by:
sudo chown -R $USER /absolute/path/to/directory
So you should give permission, then try to install it again, if you have new paths you should also give permission:
sudo chown -R $USER /usr/local/lib/python2.7/
If you need permissions, you cannot use ‘pip’ with ‘sudo’.
You can do a trick, so that you can use ‘sudo’ and install package. Just place ‘sudo python -m …’ in front of your pip command.
sudo python -m pip install --user -r package_name
So, I got this same exact error for a completely different reason. Due to a totally separate, but known Homebrew + pip bug, I had followed this workaround listed on Google Cloud’s help docs, where you create a .pydistutils.cfg file in your home directory. This file has special config that you’re only supposed to use for your install of certain libraries. I should have removed that disutils.cfg file after installing the packages, but I forgot to do so. So the fix for me was actually just…
And then everything worked as normal. Of course, if you have some config in that file for a real reason, then you won’t want to just straight rm that file. But in case anyone else did that workaround, and forgot to remove that file, this did the trick for me!
It is due permission problem,
sudo chown -R $USER /path to your python installed directory
default it would be
pip install --user -r package_name
and then say,
pip install -r requirements.txt this will install inside your env
sudo pip install -r requirements.txt this is will install into arbitrary python path.