2013-02-22 16 views
76

Zacząłem używać mojego komputera Mac do instalowania pakietów Pythona w taki sam sposób, jak robię to przy użyciu mojego komputera z systemem Windows; jednak na moim Macu natknąłem się często na odmowę odmowy odpowiedzi na błędy podczas zapisu do plików dziennika lub pakietów witryn.Czy instalacja protokołu pip pod sudo jest akceptowalna i bezpieczna?

Dlatego też pomyślałem o uruchomieniu pip install <package> pod sudo, ale czy jest to bezpieczne/akceptowalne użycie sudo, biorąc pod uwagę, że chcę tylko, aby to zostało zainstalowane na moim bieżącym koncie użytkownika?

Przykład traceback z pliku dziennika I/O error:

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 jestem w stanie zainstalować, jeśli mogę użyć sudo pip install

+11

Uważam, że '' cd/tmp; sudo pip install foo' jest odpowiednim rozwiązaniem. –

Odpowiedz

8

bo miałem ten sam problem, chcę podkreślić, że w rzeczywistości pierwszy komentarz Brian Cain jest rozwiązaniem „IOError: [ERRNO 13]” - Problem:

Jeśli wykonywane w katalogu temp (cd /tmp), IOError nie występuje już, jeśli uruchamiam sudo pip install foo.

+2

Masz szansę wyjaśnić, dlaczego to rozwiązuje problem? – Chris

+7

nadal używasz 'sudo pip' z tym rozwiązaniem "i tym samym instalowanie pakietów z uprawnieniami roota, co prawdopodobnie nie jest tym, czego potrzebujesz? – Chris

+0

Mogę się tylko domyślać, dlaczego to działa: Myślę, że niektóre części (niektórych) skryptów instalacyjnych pip wymagają dostępu do zapisu do bieżącego katalogu, ale z innym użytkownikiem Z tego powodu, jeśli zostanie wykonany w twoim katalogu domowym, to w tajemniczy sposób nie powiedzie się z powodu braku dostępu do zapisu.Jeśli jest wywoływany z '/ tmp', to działa, ponieważ każdy ma dostęp do zapisu tam – Edgar

75

użyć virtual environment:

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

Ty używaj tylko sudo lub podwyższonych uprawnień, jeśli chcesz zainstalować st uff dla globalnej, systemowej instalacji Pythona.

Najlepiej używać wirtualnego środowiska, które izoluje pakiety. W ten sposób możesz grać bez zanieczyszczania globalnej instalacji pythona.

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

+1

Jeśli jego uprawnienia są pomieszane dla jego ** katalogu domowego **, użycie virtualenv prawdopodobnie nie pomoże mu – hd1

+1

Tak, będzie, ale już się stało, więc musi to naprawić przed kontynuowaniem. – hd1

+0

Dzięki chłopaki, czytałem o virtualenv wcześniej, więc mam nadzieję, że te dwa rozwiązania razem doprowadzą mnie z powrotem na ścieżkę :) –

5

Wygląda na to, że twoje pozwolenia są pomieszane. Wpisz chown -R markwalker ~ w Terminalu i spróbuj ponownie pip? Daj mi znać, jeśli jesteś posortowany.

+0

Chociaż może to rozwiązać problem uprawnień, nie odpowiada na pytanie. –

+1

Rozwiązywanie problemów Nie wiedziałem, że mam bonus! 'chown' podaje' Operacja niedozwolona' na wielu ukrytych katalogach, takich jak '.shsh' i zakładam, że działa poprzez pliki, które może teraz ustawić, ale zobaczę, co się stanie, gdy zwróci się monit cli. –

+0

to polecenie go nie naprawiło :( –

24

Is it acceptable & safe to run pip install under sudo ?

To nie jest bezpieczne i to jest mile widziana - patrz What are the risks of running 'sudo pip'? Aby zainstalować pakiet Python w katalogu domowym nie trzeba uprawnień roota. Zobacz description z opcji --user do pip.

15

Twoim pierwotnym problemem jest to, że pip nie może zapisać dzienników w folderze.

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

Trzeba CD do starszych, w których proces wywołany może napisać jak /tmp więc cd /tmp i ponowne wywołanie polecenia prawdopodobnie będzie działać, ale nie jest to, co chcesz.

ALE rzeczywiście w tym konkretnym przypadku (nie chcąc skorzystać sudo do instalowania pakietów Pythona) i nie ma potrzeby globalnego pakietu instaluje można użyć flagi --user takiego:

pip install --user <packagename> 

i będzie działa dobrze.

Zakładam, że masz pythona z jednym pythonem użytkownika i nie chcesz kłopotać się czytaniem o virtualenv (która nie jest bardzo przyjazna dla użytkownika) lub pipenv.

jak niektórzy ludzie w komentarzach podkreśliło następny podejście nie jest to bardzo dobry pomysł, chyba, że ​​nie wiem, co robić i utknął:

Innym podejściem globalnych pakietów jak w przypadku chcesz zrobić coś takiego:

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

lub bardziej ogólnie

chown -R $USER <path to your global pip packages> 
+7

-1 Zmiana właściciela globalnego folderu * site-packages * to straszna sprawa.Opcja '--user' dla pip została podana jako rozwiązanie w mojej odpowiedzi, która istniała już podczas pisania twojego. –

+1

Nie widzę tutaj argumentu. Również biorąc pod uwagę fakt, że ktoś, kto zadaje takie pytanie na poziomie podstawowym, prawdopodobnie nie jest zaznajomiony z systemem uprawnień unixa i dlatego uruchamia instalację dla jednego użytkownika, nie ma to znaczenia. Również twoja odpowiedź właściwie nie rozwiązuje problemu użycia, który faktycznie chciałbym zainstalować w pakietach globalnych. Po wykonaniu tej czynności mogę łatwo przywrócić uprawnienia do preinstalacji. –

+1

+1 za faktyczne zapisanie * całych * poleceń. Niektórzy ludzie zakładają, że OP wie, jak zaimplementować * opcję * w wierszu poleceń, kiedy oni lub inni czytelnicy mogą tego nie robić. Nie zgadzasz się, @ PiotroDobrogost? – Mowzer

4

miałem Inst problemu po pomyślnym zainstalowaniupo pomyślnym zainstalowaniu.

Moja zacisk narzekali po Zrobiłem to:

pip install virtualenvwrapper 

Więc bezskutecznie próbowała to (NIEZALECANY):

sudo pip install virtualenvwrapper 

Potem powodzeniem zainstalowany z to:

pip install --user virtualenvwrapper 
+0

Opcja -user dla pip została podana jako rozwiązanie w mojej odpowiedzi, która istniała już podczas pisania twojego. To powinien być komentarz, a nie odpowiedź. –