instalacja pip kończy się niepowodzeniem z: OSError: [Errno 13] Odmowa dostępu do katalogu


123

pip install -r requirements.txtkończy się niepowodzeniem z poniższym wyjątkiem OSError: [Errno 13] Permission denied: '/usr/local/lib/.... Co jest nie tak i jak to naprawić? (Próbuję skonfigurować 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'

Powiązane (specyficzne dla macOS / homebrew) stackoverflow.com/questions/33004708/ ...
— wim

Odpowiedzi:


76

Opcja a) Utwórz virtualenv, aktywuj go i zainstaluj:

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

Opcja b) Zainstaluj w swoim katalogu domowym:

pip install --user -r requirements.txt

Moje zalecenie użyj opcji bezpiecznej (a), aby wymagania tego projektu nie kolidowały z wymaganiami innych projektów.


2
Wystąpił taki błąd sudo:pip: command not foundw mojej instancji aws ec2 podczas uruchamiania tego polecenia. Proszę pomóż.
— user3768495

2
@ user3768495 Prawdopodobnie pip nie jest instalowany domyślnie. Która dystrybucja jest Twoją EC2? Ponadto python2 może nie być zainstalowany, więc albo instalujesz python2, albo używasz pip3. Uważaj jednak z tym.
— hectorcanto

33
Czytałem, że nie jest to zalecane w wielu miejscach. Wygląda na to, musimy ostrzec przed użycia sudo podczas pracy PIP (patrz odpowiedź Bert)
— Justus Eapen

3
@JustusEapen: Nie wiem, co o tym myślę. Nie sądzę, aby właściwą odpowiedzią na pytanie OP był podręcznik dotyczący podstawowej higieny komputera, w tym „nie uruchamiaj podejrzanego kodu z uprawnieniami superużytkownika” i „regularnie myj zęby”. Uważam, że optymalną odpowiedzią powinno być wskazanie, że pakiety mogą być instalowane dla każdego użytkownika lub dla całego systemu, a instalacja w całym systemie, zgodnie z życzeniem OP (są ku temu zupełnie nieprzewidywalne powody), wymaga uprawnień superużytkownika. Przestrzeganie przed instalowaniem pakietów na ścieżce systemowej jest prawdopodobnie zadaniem kogoś innego przy innym pytaniu SO.
— Tobia Tesan

8
głosowanie w dół z powodu porady sudo. mimo że działa teraz, przyprawi Cię o wiele bólów głowy w przyszłości.
— Gerald

318

Naprawdę powinniśmy przestać doradzać używanie sudowith pip install. Lepiej najpierw spróbować pip install --user. Jeśli to się nie powiedzie, spójrz na najwyższy wpis tutaj .

Powód, dla którego nie powinieneś używać sudo jest następujący:

Kiedy uruchamiasz pip with sudo, uruchamiasz dowolny kod Pythona z Internetu jako użytkownik root, co jest dość dużym zagrożeniem bezpieczeństwa. Jeśli ktoś umieści złośliwy projekt na PyPI i go zainstalujesz, dajesz atakującemu uprawnienia roota do twojego komputera.


5
Dobra obserwacja. To w końcu dotyczy wszystkich sudo x install, wszystkich x(w tym x = make).
— Tobia Tesan,

1
To również rozwiązało mój problem. Co robi add --user?
— Miles Johnson,

1
@MilesJohnson Dodanie powoduje --userzainstalowanie pakietu w katalogu domowym, a nie w katalogu głównym. Zainstalowanie czegoś w tej lokalizacji nie wymaga żadnych dodatkowych uprawnień.
— bert

1
Dodatkowo, jeśli jesteś na zdalnym serwerze za proxy, „sudo” zapobiega pobieraniu pakietów z repozytoriów internetowych i / lub repozytoriów git w sieci zdalnego serwera.
— Ataxias

2
Wszystkie wzmianki o sudozostały usunięte rok temu. Ta odpowiedź jest nieaktualna - popraw ją i zaktualizuj. Należy również wspomnieć o instalacjach dla poszczególnych użytkowników i o instalacjach w całym systemie oraz o uprawnieniach. Nie używaj swojej odpowiedzi do bezpośredniej krytyki innych odpowiedzi, które szybko się dezaktualizują.
— smci

28

Próbujesz zainstalować pakiet na ścieżce obejmującej cały system bez posiadania uprawnień.

  1. Ogólnie rzecz biorąc, możesz użyć sudodo tymczasowego uzyskania uprawnień superużytkownika na swoją odpowiedzialność w celu zainstalowania pakietu na ścieżce obejmującej cały system:

     sudo pip install -r requirements.txt

    Więcej informacji znajdziesz sudo tutaj .

    Właściwie to zły pomysł i nie ma dla niego dobrego przypadku, zobacz komentarz @ wim.

  2. Jeśli nie chcesz wprowadzać zmian w całym systemie, możesz zainstalować pakiet w ścieżce dla użytkownika przy użyciu rozszerzenia--user flagi.

    Wystarczy:

     pip install --user runloop requirements.txt
  3. Wreszcie, aby uzyskać jeszcze dokładniejszą kontrolę , możesz również użyć virtualenv , który może być lepszym rozwiązaniem dla środowiska programistycznego, zwłaszcza jeśli pracujesz nad wieloma projektami i chcesz śledzić zależności każdego z nich.

    Po aktywowaniu virtualenv za pomocą

    $ my-virtualenv/bin/activate

    następujące polecenie zainstaluje pakiet wewnątrz virtualenv (a nie na ścieżce dla całego systemu):

    pip install -r requirements.txt


4
Uruchamianie pip z rootem wiąże się z zagrożeniami bezpieczeństwa
— Nrzonline,

Uruchamianie czegokolwiek, co uruchamia kod z Internetu jako root, wiąże się z zagrożeniami bezpieczeństwa.
— Tobia Tesan

To prawie najlepsza odpowiedź, ale nadal wymaga aktualizacji. a) Teraz mamy pyenv/pipenv, powinniśmy wspomnieć o tych, zamiast virtualenv(lub conda-env) b) sudo uważane za szkodliwe i zobaczyć inne odpowiedzi, dlaczego. Więc umieść odpowiedź opartą na env jako pierwszą, a sudo na końcu, z dużym zastrzeżeniem.
— smci

1
sudo pip install -r requirements.txtnigdy nie jest w porządku. Środowisko Pythona systemu należy do systemu, kropka . Jeśli nie zainstalować Pythona więcej rzeczy do systemu, zrób to z menedżera pakietów tylko (np sudo yum install, apt-getitp ...), ponieważ te repo powinny mieć bezpiecznych i zgodnych wersji bibliotek skutku.
— wim

1
@TobiaTesan Stary sudo make install, zwykle skompilowany + linkowany kod nie jest tak naprawdę analogiczny do a, sudo pip installponieważ instalacja w systemie Python env może unieważnić zależności . Załóżmy, że istnieje usługa systemowa python-frobnicator, która ma zależność od froblib(będzie to również znajdować się w menedżerze pakietów i przypięta do zgodnej wersji), a następnie jest sudo pip installinna aplikacja lub biblioteka zależna od „ froblib > 1.2”. Pip z radością „zaktualizuje” wersję systemu froblibdo nowszej, która może być niekompatybilna / niesprawdzona i zepsuć system.
— wim

26

Po prostu wyjaśniając, co zadziałało dla mnie po wielu bólach w Linuksie (opartym na systemie Ubuntu) na podstawie błędów odmowy uprawnień i wykorzystując powyższą odpowiedź Berta, teraz używam ...

$ pip install --user <package-name>

lub jeśli uruchamiasz pip na pliku wymagań ...

$ pip install --user -r requirements.txt

i działają niezawodnie dla każdej instalacji pip, w tym tworzenia środowisk wirtualnych.

Jednak najczystszym rozwiązaniem z moich dalszych doświadczeń była instalacja python-virtualenvi korzystanie virtualenvwrapperzsudo apt-get install na poziomie systemowym.

Następnie w środowiskach wirtualnych używaj pip installbez --userflagi ORAZ bez sudo. Znacznie czystsze, bezpieczniejsze i ogólnie łatwiejsze.


Otrzymuję komunikat „Nie można przeprowadzić instalacji„ --user ”. Pakiety witryn użytkowników nie są widoczne w tym virtualenv”. błąd podczas próby użyciapip install --user -r requirements.txt
— Amir A. Shabani

@ AmirA.Shabani odpowiedź została zmieniona od czasu twojego pytania. Teraz jest napisane „w środowiskach wirtualnych, użyj pip install bez flagi --user ORAZ bez sudo”
— Daishi

7

Użytkownik nie ma uprawnień do zapisu w niektórych ścieżkach instalacyjnych języka Python. Możesz udzielić zgody poprzez:

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

Powinieneś więc dać pozwolenie, a następnie spróbować zainstalować go ponownie, jeśli masz nowe ścieżki, powinieneś również przyznać uprawnienia:

sudo chown -R $USER /usr/local/lib/python2.7/

2
W przypadku Pythona zainstalowanego z brew, jest to właściwa odpowiedź, ponieważ brew obsługuje pakiety jako użytkownik lokalny (bez roota).
— idbrii

9
chowning katalogu / usr / local nie jest dobrym pomysłem. Nie należy do użytkownika. Powinieneś przeczytać o strukturze plików unixa.
— user8162

6
W /usrdzisiejszych czasach rzeczy poniżej zwykle należałyby do roota. Rekurencyjne żarcie tam może poważnie zepsuć twój system. UNIKAJ .
— wim

0

Jeśli potrzebujesz uprawnień, nie możesz używać „pip” z „sudo”. Możesz zrobić sztuczkę, aby móc użyć „sudo” i zainstalować pakiet. Po prostu umieść „sudo python -m ...” przed poleceniem pip.

sudo python -m pip install --user -r package_name

Wydaje mi się to w porządku, ale czy mógłbyś dodać jakieś wyjaśnienie.
— pythonic833

-1

Tak więc otrzymałem ten sam dokładny błąd z zupełnie innego powodu. Ze względu na całkowicie oddzielny, ale znany błąd Homebrew + pip , zastosowałem to obejście wymienione w dokumentacji pomocy Google Cloud, w której tworzysz plik .pydistutils.cfg w swoim katalogu domowym. Ten plik ma specjalną konfigurację, której powinieneś używać tylko do instalacji niektórych bibliotek. Powinienem był usunąć ten plik disutils.cfg po zainstalowaniu pakietów, ale zapomniałem o tym. Więc poprawką dla mnie było po prostu ...

rm ~/.pydistutils.cfg.

A potem wszystko działało normalnie. Oczywiście, jeśli masz jakąś konfigurację w tym pliku z prawdziwego powodu, nie będziesz chciał po prostu skorygować tego pliku. Ale na wypadek, gdyby ktoś inny zastosował to obejście i zapomniał usunąć ten plik, to załatwiło sprawę!


-1

To problem z pozwoleniem,

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

Domyślnie tak byłoby /usr/local/lib/python2.7/

lub spróbuj

pip install --user -r package_name

a następnie powiedz, pip install -r requirements.txtże to zainstaluje się w twoim środowisku env

nie mów, sudo pip install -r requirements.txtże to zainstaluje się w dowolnej ścieżce Pythona.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.