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'
RunLoop
źródło
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.

hectorcanto
źródło
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.

bert
źródło
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

Tobia Tesan
źródło
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.

Thom Ives
źródło
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/
Mesut Pistolety
źródło
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
j35t3r
źródło
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ę!

bwest87
źródło
-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.

Mohideen bin Mohammed
źródło