Pip-Installation schlägt fehl mit: OSError: [Errno 13] Berechtigung für Verzeichnis verweigert

123

pip install -r requirements.txtschlägt mit der folgenden Ausnahme fehl OSError: [Errno 13] Permission denied: '/usr/local/lib/.... Was ist los und wie behebe ich das? (Ich versuche Django einzurichten )

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'
RunLoop
quelle
Verwandte (macOS / homebrew-spezifisch) stackoverflow.com/questions/33004708/…
wim

Antworten:

76

Option a) Erstellen Sie eine virtuelle Umgebung, aktivieren Sie sie und installieren Sie:

virtualenv .venv
source .venv/bin/activate
pip install -r requirements.txt

Option b) Installieren Sie in Ihrem Homedir:

pip install --user -r requirements.txt

Meine Empfehlung verwendet die Option safe (a), damit die Anforderungen dieses Projekts die Anforderungen anderer Projekte nicht beeinträchtigen.

Hectorcanto
quelle
2
sudo:pip: command not foundBeim Ausführen dieses Befehls ist auf meiner aws ec2-Instanz ein solcher Fehler aufgetreten. Bitte helfen Sie.
user3768495
2
@ user3768495 Wahrscheinlich ist pip nicht standardmäßig installiert. Welche Distribution ist deine EC2? Außerdem ist python2 möglicherweise nicht installiert. Sie installieren also entweder python2 oder verwenden pip3. Sei aber vorsichtig damit.
Hectorcanto
33
Ich habe gelesen, dass dies jetzt an mehreren Stellen nicht empfohlen wird. Scheint, als sollten wir beim Ausführen von Pip vor der Verwendung von
Sudo warnen
3
@ JustusEapen: Ich weiß nicht, wie ich mich dabei fühle. Ich denke nicht, dass die richtige Antwort auf die Frage von OP ein Handbuch zur grundlegenden Computerhygiene ist, einschließlich "Führen Sie keinen zwielichtigen Code mit Superuser-Berechtigungen aus" und "Putzen Sie Ihre Zähne regelmäßig". Ich finde, die optimale Antwort sollte darauf hinweisen, dass Pakete pro Benutzer oder systemweit installiert werden können und dass die systemweite Installation nach OP-Wunsch (es gibt absolut wichtige Gründe dafür) die Erlaubnis eines Superbenutzers erfordert. Die Warnung vor der Installation von Paketen auf dem Systempfad ist wahrscheinlich die Aufgabe eines anderen bei einer anderen SO-Frage.
Tobia Tesan
8
Downvoting wegen sudoBeratung. Obwohl es jetzt funktioniert, wird es Ihnen in Zukunft viele Kopfschmerzen bereiten.
Gerald
318

Wir sollten wirklich aufhören, die Verwendung von sudowith zu empfehlen pip install. Es ist besser, es zuerst zu versuchen pip install --user. Wenn dies fehlschlägt, werfen Sie einen Blick auf den oberen Beitrag hier .

Der Grund, den Sie nicht verwenden sollten, sudoist folgender:

Wenn Sie pip with ausführen sudo, führen Sie als Root-Benutzer beliebigen Python-Code aus dem Internet aus, was ein ziemlich großes Sicherheitsrisiko darstellt. Wenn jemand ein schädliches Projekt auf PyPI erstellt und Sie es installieren, gewähren Sie einem Angreifer Root-Zugriff auf Ihren Computer.

bert
quelle
5
Gute Beobachtung. Das gilt schließlich für alle sudo x install, für alle x(einschließlich x = make).
Tobia Tesan
1
Dies löste auch mein Problem. Was macht das Hinzufügen von --user?
Miles Johnson
1
@MilesJohnson Adding --userinstalliert das Paket in Ihrem Home-Verzeichnis und nicht im Stammverzeichnis. Für die Installation von etwas an diesem Speicherort sind keine zusätzlichen Berechtigungen erforderlich.
Bert
1
Wenn Sie sich auf einem Remote-Server hinter einem Proxy befinden, verhindert "sudo" außerdem, dass Sie die Pakete aus Internet-Repositorys und / oder Git-Repositorys des Netzwerks des Remote-Servers abrufen.
Ataxias
2
Alle Erwähnungen sudowurden vor einem Jahr entfernt. Diese Antwort ist veraltet - bitte überarbeiten und aktualisieren Sie sie. Sie müssen auch die Installation pro Benutzer im Vergleich zu systemweiten Installationen und Berechtigungen angeben. Verwenden Sie Ihre Antwort nicht, um andere Antworten direkt zu kritisieren, da diese schnell veraltet sind.
smci
28

Sie versuchen, ein Paket auf dem systemweiten Pfad zu installieren, ohne die Berechtigung dazu zu haben.

  1. Im Allgemeinen können Sie sudovorübergehend Superuser- Berechtigungen in Ihrer Verantwortung abrufen, um das Paket auf dem systemweiten Pfad zu installieren:

     sudo pip install -r requirements.txt

    Mehr dazu finden Sie sudo hier .

    Eigentlich ist das eine schlechte Idee und es gibt keinen guten Anwendungsfall dafür, siehe @ wims Kommentar.

  2. Wenn Sie keine systemweiten Änderungen vornehmen möchten, können Sie das Paket mithilfe des Flags auf Ihrem Benutzerpfad installieren --user.

    Alles was es braucht ist:

     pip install --user runloop requirements.txt
  3. Schließlich können Sie für eine noch feinere Steuerung auch eine virtuelle Umgebung verwenden , die möglicherweise die überlegene Lösung für eine Entwicklungsumgebung darstellt, insbesondere wenn Sie an mehreren Projekten arbeiten und die Abhängigkeiten der einzelnen Projekte verfolgen möchten.

    Nach dem Aktivieren Ihrer virtuellen Umgebung mit

    $ my-virtualenv/bin/activate

    Der folgende Befehl installiert das Paket innerhalb der virtuellen Umgebung (und nicht im systemweiten Pfad):

    pip install -r requirements.txt

Tobia Tesan
quelle
4
Das Ausführen von Pip mit Root
birgt
Das Ausführen von Code aus dem Internet als Root birgt Sicherheitsrisiken.
Tobia Tesan
Dies ist fast die beste Antwort, muss aber noch aktualisiert werden. a) Jetzt haben wir diese zu pyenv/pipenverwähnen, anstatt virtualenv(oder conda-env) b) Sudo als schädlich zu betrachten, und sehen die anderen Antworten, warum. Stellen Sie also die env-basierte Antwort an die erste und die sudo-Antwort an die letzte Stelle mit einem großen Haftungsausschluss.
smci
1
sudo pip install -r requirements.txtist nie richtig. Die Python-Umgebung des Systems gehört zum System, Punkt . Wenn Sie mehr Python Sachen in das System zu tun installieren, tun Sie es mit Paket - Manager nur (zB sudo yum install, apt-getetc ...) , da diese repos sichere und kompatible Versionen von Bibliotheken Erfolg haben sollte.
wim
1
@TobiaTesan Der alte sudo make install, normalerweise kompilierte + verknüpfte Code ist nicht wirklich analog zu a, sudo pip installda die Installation auf dem System Python env Abhängigkeiten ungültig machen kann . Angenommen, es gibt einen Systemdienst python-frobnicator, von dem eine Abhängigkeit besteht froblib(dieser befindet sich ebenfalls im Paketmanager und ist an eine kompatible Version gebunden), und dann sudo pip installeine andere App oder Bibliothek, die von " froblib > 1.2" abhängig ist . Pip wird die Systemversion von gerne froblibmit einer neueren Version "aktualisieren" , die möglicherweise nicht kompatibel / ungetestet ist und das System beschädigt.
wim
26

Nur um zu klären, was für mich nach vielen Schmerzen in Linux (Ubuntu-basiert) aufgrund von Fehlern, denen die Erlaubnis verweigert wurde, funktioniert hat, und um die oben genannte Antwort von Bert zu nutzen, verwende ich jetzt ...

$ pip install --user <package-name>

oder wenn pip auf einer Anforderungsdatei ausgeführt wird ...

$ pip install --user -r requirements.txt

und diese funktionieren zuverlässig für jede Pip-Installation, einschließlich der Erstellung virtueller Umgebungen.

Die sauberste Lösung meiner weiteren Erfahrung war jedoch die Installation python-virtualenvund virtualenvwrappermit sudo apt-get installauf Systemebene.

Verwenden Sie dann in virtuellen Umgebungen pip installohne --userFlag UND ohne sudo. Insgesamt viel sauberer, sicherer und einfacher.

Thom Ives
quelle
Ich erhalte die Meldung "Kann eine '--user'-Installation nicht durchführen. Benutzer-Site-Pakete sind in dieser virtuellen Umgebung nicht sichtbar." Fehler beim Versuch zu verwendenpip install --user -r requirements.txt
Amir A. Shabani
@ AmirA.Shabani Die Antwort wurde seit Ihrer Frage bearbeitet. Es heißt jetzt: «Verwenden Sie in virtuellen Umgebungen die Pip-Installation ohne das Flag --user UND ohne sudo»
Daishi,
7

Der Benutzer hat keine Schreibberechtigung für einige Python-Installationspfade. Sie können die Erlaubnis geben durch:

sudo chown -R $USER /absolute/path/to/directory

Sie sollten also die Berechtigung erteilen und dann versuchen, sie erneut zu installieren. Wenn Sie neue Pfade haben, sollten Sie auch die Berechtigung erteilen:

sudo chown -R $USER /usr/local/lib/python2.7/
Mesut GUNES
quelle
2
Für Python, das mit Brew installiert wurde, ist dies die richtige Antwort, da Brew Pakete als lokaler Benutzer verwaltet (kein Root).
idbrii
9
Das Verzeichnis / usr / local zu chowning ist keine gute Idee. Es gehört nicht dem Benutzer. Sie sollten über die Unix-Dateistruktur lesen.
user8162
6
Sachen unter gehören /usrheutzutage normalerweise Root. Das rekursive Chowning dort könnte Ihr System erheblich vermasseln. VERMEIDEN .
wim
0

Wenn Sie Berechtigungen benötigen, können Sie 'pip' nicht mit 'sudo' verwenden. Sie können einen Trick machen, damit Sie 'sudo' verwenden und das Paket installieren können. Platzieren Sie einfach 'sudo python -m ...' vor Ihrem pip-Befehl.

sudo python -m pip install --user -r package_name
j35t3r
quelle
Scheint mir in Ordnung zu sein, aber könnten Sie bitte eine Erklärung hinzufügen.
pythonic833
-1

Ich habe also genau diesen Fehler aus einem ganz anderen Grund erhalten. Aufgrund eines völlig separaten, aber bekannten Homebrew + pip-Fehlers habe ich diese in den Hilfedokumenten von Google Cloud aufgeführte Problemumgehung befolgt, in der Sie eine .pydistutils.cfg-Datei in Ihrem Home-Verzeichnis erstellen. Diese Datei verfügt über eine spezielle Konfiguration, die Sie nur für die Installation bestimmter Bibliotheken verwenden sollen. Ich hätte diese Datei disutils.cfg nach der Installation der Pakete entfernen sollen, aber ich habe vergessen, dies zu tun. Das Update für mich war also eigentlich nur ...

rm ~/.pydistutils.cfg.

Und dann hat alles wie gewohnt funktioniert. Wenn Sie aus einem echten Grund eine Konfiguration in dieser Datei haben, möchten Sie diese Datei natürlich nicht einfach direkt speichern. Aber falls jemand anderes diese Problemumgehung durchgeführt und vergessen hat, diese Datei zu entfernen, hat dies den Trick für mich getan!

bwest87
quelle
-1

Es ist ein Problem mit der Berechtigung,

sudo chown -R $USER /path to your python installed directory

Standard wäre es /usr/local/lib/python2.7/

oder Versuche,

pip install --user -r package_name

und sagen Sie dann, pip install -r requirements.txtdies wird in Ihrer Umgebung installiert

Sagen Sie nicht, sudo pip install -r requirements.txtdies wird in einem beliebigen Python-Pfad installiert.

Mohideen bin Mohammed
quelle