Czy uruchamianie pip install w sudo jest dopuszczalne i bezpieczne?

115

Zacząłem używać mojego Maca do instalowania pakietów Pythona w taki sam sposób, jak robię to na moim komputerze z Windows w pracy; jednak na moim komputerze Mac często spotykałem się z błędami odmowy uprawnień podczas zapisywania do plików dziennika lub pakietów witryn.

Dlatego pomyślałem o uruchomieniu pip install <package>pod, sudoale czy jest to bezpieczne / dopuszczalne użycie sudo, biorąc pod uwagę, że chcę tylko zainstalować to na moim obecnym koncie użytkownika?

Przykład śledzenia zwrotnego z błędu wejścia / wyjścia pliku dziennika:

Command /usr/bin/python -c "import setuptools;__file__='/Users/markwalker/build/pycrypto/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --single-version-externally-managed --record /var/folders/tq/hy1fz_4j27v6rstzzw4vymnr0000gp/T/pip-k6f2FU-record/install-record.txt failed with error code 1 in /Users/markwalker/build/pycrypto
Storing complete log in /Users/markwalker/Library/Logs/pip.log
Traceback (most recent call last):
  File "/usr/local/bin/pip", line 8, in <module>
    load_entry_point('pip==1.1', 'console_scripts', 'pip')()
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/__init__.py", line 116, in main
    return command.main(args[1:], options)
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/basecommand.py", line 141, in main
    log_fp = open_logfile(log_fn, 'w')
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/basecommand.py", line 168, in open_logfile
    log_fp = open(filename, mode)
IOError: [Errno 13] Permission denied: '/Users/markwalker/Library/Logs/pip.log'

Aktualizacja Najprawdopodobniej wynikało to z uprawnień, jednak najlepszym podejściem jest użycie środowisk wirtualnych w projektach Pythona. sudo pipNależy unikać biegania, chyba że jest to absolutnie konieczne.

markwalker_
źródło
12
Uważam, że „ cd /tmp; sudo pip install foo” to odpowiednie obejście.
Brian Cain
@pradyunsg po co oznaczać tak stare pytanie?
markwalker_
3
W istocie aktualna akceptowana odpowiedź (i aktualizacja w pytaniu) sugeruje uruchomienie „sudo pip” - coś, co opiekunowie pip (ja jestem jednym z nich) aktywnie mówią ludziom, aby tego nie robili, ponieważ może to spowodować uszkodzenie systemu operacyjnego na MacOS i wielu (wszystkich?) głównych dystrybucjach Linuksa. Wylądowałem tutaj, używając terminów, które ktoś mógłby debugować ich sytuację i po prostu chciałem przekierować ludzi do lokalizacji z lepszą radą. Nie zastanawiałem się nad postawieniem tego pytania i odpowiedź jest lepsza zgodnie z powyższym stwierdzeniem. (brak znaków)
pradyunsg
@markwalker_ czy byłbyś skłonny usunąć tę poradę z pytania i ewentualnie zastąpić ją lepszą radą (używając --user lub virtualenv)?
pradyunsg

Odpowiedzi:

105

Użyj środowiska wirtualnego :

$ virtualenv myenv
.. some output ..
$ source myenv/bin/activate
(myenv) $ pip install what-i-want

Używasz sudouprawnień lub podwyższonych tylko wtedy, gdy chcesz zainstalować rzeczy do globalnej instalacji Pythona dla całego systemu.

Najlepiej jest używać środowiska wirtualnego, które izoluje pakiety za Ciebie. W ten sposób możesz bawić się bez zanieczyszczania globalnej instalacji Pythona.

Jako bonus, virtualenv nie potrzebuje podwyższonych uprawnień.

Burhan Khalid
źródło
2
Jeśli jego uprawnienia do katalogu domowego są pomieszane , użycie virtualenv raczej mu nie pomoże
hd1
1
Tak, będzie, ale już się wydarzyło, więc musi to naprawić, zanim przejdzie dalej.
hd1
1
Dzięki chłopaki, czytałem już o virtualenv, więc mam nadzieję, że te dwa rozwiązania razem pozwolą mi wrócić na
właściwe
1
również, aby zainstalować virtualenv, musisz sudo ... czy istnieje obejście?
jimijazz
8
Nie rozumiem, dlaczego to najlepsza odpowiedź. Pytanie NIE dotyczy środowisk wirtualnych. Chodzi o ważność używania sudo pip install. Powiedzmy, że muszę zainstalować pakiet, którego będę używać w wielu projektach lub na poziomie systemu. Na przykład niektóre narzędzia CLI, takie jak pgcli. Oczywiście nie potrzebuję do tego wirtualnego środowiska, chcę go zainstalować globalnie. Powinienem użyć, sudo pip installczy jest kilka poprawnych praktyk? Oto jest pytanie.
Alex Belyaev
42

Czy bieganie pip installpod wodą jest dopuszczalne i bezpieczne sudo?

To nie jest bezpieczne i nie jest mile widziane - zobacz Jakie jest ryzyko związane z uruchomieniem „sudo pip”? Aby zainstalować pakiet Pythona w swoim katalogu domowym, nie potrzebujesz uprawnień roota. Widzieć opis z --usermożliwością pip.

Piotr Dobrogost
źródło
Chociaż Twoje rozwiązanie było pierwszym, które faktycznie zadziałało, @throws_exceptions_at_you utworzył odpowiedź z rzeczywistym kodem, a nie przekierowaniem do dokumentacji
Edenshaw,
Nie sudo pip installznałem szkód wynikających z jego używania. Jak mogę cofnąć to polecenie lub blokowanie, aby uruchomić sudo?
Emre Değirmenci
26

Pierwotnym problemem jest to, że pip nie może zapisywać dzienników w folderze.

IOError: [Errno 13] Permission denied: '/Users/markwalker/Library/Logs/pip.log'

Musisz przejść do folderu, w którym wywołany proces może pisać w /tmpten sposób, cd /tmpa ponowne wywołanie polecenia prawdopodobnie zadziała, ale nie jest tym, czego chcesz.

ALE w tym konkretnym przypadku (nie chcesz używać sudodo instalowania pakietów Pythona) i nie ma potrzeby instalowania pakietów globalnych, możesz użyć tej --userflagi:

pip install --user <packagename>

i będzie działać dobrze.

Zakładam, że masz instalację Pythona dla jednego użytkownika i nie chcesz zawracać sobie głowy czytaniem o virtualenv (który nie jest zbyt przyjazny dla użytkownika) lub pipenv .

Jak zauważyli niektórzy w sekcji komentarzy, następne podejście nie jest dobrym pomysłem, chyba że nie wiesz, co robić i utkniesz:

Inne podejście do pakietów globalnych, takie jak w twoim przypadku, które chcesz zrobić:

chown -R $USER /Library/Python/2.7/site-packages/

lub bardziej ogólnie

chown -R $USER <path to your global pip packages>
throws_exceptions_at_you
źródło
9
-1 Zmiana własności globalnego folderu pakietów witryn to straszna rzecz. --userRozwiązaniem dla pip dano w postaci roztworu w mojej odpowiedzi, które już istniały, gdy pisał swoje.
Piotr Dobrogost
1
Nie widzę tutaj argumentu. Biorąc również pod uwagę fakt, że ktoś, kto zadaje takie podstawowe pytanie, prawdopodobnie nie jest zaznajomiony z systemem uprawnień unixa, a zatem uruchamianie instalacji dla jednego użytkownika nie ma znaczenia. Również Twoja odpowiedź faktycznie nie odnosi się do przypadku użycia mnie, CHCĘ zainstalować na globalnych pakietach. Po wykonaniu tej czynności mogłem łatwo przywrócić uprawnienia z powrotem do preinstalacji.
throws_exceptions_at_you
2
+1 za faktyczne napisanie całych poleceń. Niektórzy ludzie zakładają, że OP wie, jak zaimplementować opcję w wierszu poleceń, podczas gdy oni lub inni czytelnicy mogą tego nie robić . Nie zgadzasz się, @PiotrDobrogost?
Pozwól mi o tym porozmawiać,
dodanie --userpomaga mi!
Honghao Zhang
2
Zmiana uprawnień do całego site-packageskatalogu systemu w Pythonie jest podobna do „naprawiania” pompy przez walenie w nią kluczem. Jest chroniony nie bez powodu - nie powinieneś tam instalować żadnych rzeczy . Prawdziwym rozwiązaniem jest, aby nie mieszać systemu dystrybucji Python z programowaniem z dnia na dzień. Zainstaluj inną dystrybucję Pythona (z Python.org, Homebrew, Canopy itp.).
charlesreid 1
9

Ponieważ miałem ten sam problem, chcę podkreślić, że tak naprawdę pierwszy komentarz Briana Caina to rozwiązanie problemu „IOError: [Errno 13]” - problem:

Jeśli zostanie wykonany w katalogu tymczasowym ( cd /tmp), błąd IOError nie będzie się już pojawiał, jeśli uruchomię sudo pip install foo.

Edgar
źródło
2
Czy możesz wyjaśnić, dlaczego to rozwiązuje problem?
Chris
8
nadal używasz sudo piptego "rozwiązania" i tym samym instalujesz pakiety z uprawnieniami roota, co prawdopodobnie nie jest tym, czego chcesz?
Chris,
Mogę tylko zgadywać, dlaczego to działa: myślę, że część (niektórych) skryptów instalacyjnych pip wymaga dostępu do zapisu w bieżącym katalogu, ale z innym użytkownikiem. Dlatego, jeśli zostanie uruchomiony w katalogu domowym, w tajemniczy sposób kończy się niepowodzeniem z powodu braku dostępu do zapisu. Jeśli zostanie wezwany od wewnątrz/tmp , działa, ponieważ każdy ma tam dostęp do zapisu.
Edgar,
Nie ma dostępu do zapisu w '/Users/markwalker/Library/Logs/pip.log'
throws_exceptions_at_you
5

virtualenvwrapperPo pomyślnym zainstalowaniu miałem problem z instalacjąvirtualenv .

Mój terminal narzekał po tym, jak to zrobiłem:

pip install virtualenvwrapper

Więc bezskutecznie próbowałem tego (NIE ZALECANE) :

sudo pip install virtualenvwrapper

Potem ja pomyślnie zainstalowałem go za pomocą tego:

pip install --user virtualenvwrapper
Pozwól mi się nad tym zastanowić
źródło
Opcja --user dla pip została podana jako rozwiązanie w mojej odpowiedzi, które istniało już, kiedy pisałeś swoją. To powinien być komentarz, a nie odpowiedź.
Piotr Dobrogost
mówisz NIE zalecane, ale oficjalne notatki instalacyjne mówią OK, aby zainstalować virtualenvwrapper z sudo. To samo dotyczy virtualenv. Zadane tutaj pytanie nie odnosi się do tych dwóch, więc zakładam, że wszystkie inne odpowiedzi tutaj dotyczą ogólnych pakietów Pythona.
mehmet
Dla przyszłych czytelników przekreśliłem moją flagę „nie polecam” w mojej odpowiedzi w związku z powyższym komentarzem, ale jeszcze tego nie zweryfikowałem. Dlatego jeszcze nie usunąłem flagi.
Let Me Tink About It
4

Wygląda na to, że Twoje uprawnienia są pomieszane. Wpisz chown -R markwalker ~terminal i spróbuj pipponownie? Daj mi znać, jeśli zostaniesz przydzielony.

hd1
źródło
Chociaż może to rozwiązać problem z uprawnieniami, nie odpowiada na pytanie.
Burhan Khalid
1
Rozwiązywanie problemów, o których nie wiedziałem, że mam, to bonus! chownudostępnia Operation not permittedwiele ukrytych katalogów, takich jak .shsh& Zakładam, że pracuje z plikami, które może teraz ustawić, ale zobaczę, co się stanie, gdy powróci zachęta CLI.
markwalker_