Чи прийнятно і безпечно запускати інсталяцію pip під sudo?


114

Я почав використовувати свій Mac для встановлення пакетів Python так само, як це робиться з моїм ПК під керуванням Windows; однак на моєму Mac я стикався з частими помилками, у яких відмовляли у дозволі під час написання файлів журналів чи пакетів сайтів.

Тому я думав про запуск pip install <package>під, sudoале це безпечне / прийнятне використання sudo, враховуючи, що я просто хочу, щоб це було встановлено під моїм поточним обліковим записом користувача?

Приклад відстеження помилки вводу / виводу логфайлу:

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'

Оновлення Це, ймовірно, аж до дозволів, однак найкращим підходом є використання віртуальних середовищ для ваших проектів python. Бігати sudo pipслід уникати, якщо це абсолютно не потрібно.


12
Я вважаю, що " cd /tmp; sudo pip install foo" є адекватним рішенням.
Брайан Каїн


@pradyunsg, чому позначити таке старе питання?
markwalker_

3
По суті, поточна прийнята відповідь (і оновлення у запитанні) пропонує запустити "sudo pip" - те, що технічні працівники Pip (я є одним із них) активно говорять людям цього не робити, оскільки це може призвести до порушення вашої операційної системи. на MacOS та багатьох (усіх?) основних дистрибутивах Linux. Я приземлився тут, використовуючи терміни, що хтось, налагоджуючи їхню ситуацію, міг би просто захотіти, щоб перенаправити людей до місця з кращими порадами. Не замислювався над тим, щоб насправді довести це питання, і відповідь краще відповідати вищевикладеному твердженню. (поза персонажами)
pradyunsg

@markwalker_ Чи бажаєте ви видалити цю пораду з питання і, можливо, замінити її на кращу пораду (використовуючи --user або virtualenv)?
pradyunsg

Відповіді:


105

Використовуйте віртуальне середовище :

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

Ви користуєтесь sudoабо підвищеними дозволами лише тоді, коли хочете встановити матеріали для глобальної, всеї системи установки Python.

Найкраще використовувати віртуальне середовище, яке виділяє пакети для вас. Таким чином ви можете пограти, не забруднюючи глобальну установку пітона.

Як бонус, virtualenv не потребує підвищених дозволів.


2
Якщо його дозволи змішані для домашнього каталогу , використання virtualenv, швидше за все, не допоможе йому
hd1

1
Так, це буде, але це вже сталося, тому йому потрібно виправити це, перш ніж продовжувати.
hd1

1
Дякую, хлопці, я читав про virtualenv раніше, тому сподіваюсь, що ці два рішення разом повернуть мене на шлях :)
markwalker_

1
Крім того, для встановлення virtualenv вам потрібно судо ... чи існує вирішення?
jimijazz

8
Я не розумію, чому це найкраща відповідь. Питання НЕ про віртуальні середовища. Йдеться про термін використання sudo pip install. Скажімо, мені потрібно встановити якийсь пакет, який я буду використовувати в багатьох проектах або на системному рівні. Такі, як деякі інструменти CLI, як pgcli. Очевидно, що для цього мені не потрібна віртуальна середовище, я хочу встановити її в усьому світі. Чи варто використовувати sudo pip installчи є якісь правильніші практики? В цьому питання.
Олексій Бєляєв

42

Прийнятно і безпечно працювати pip installпід sudo?

Це не безпечно, і це нахмуриться - див. Які ризики запуску "sudo pip"? Для встановлення пакету Python у домашній каталог вам не потрібні привілеї root. Див опису в --userопції для пипа.


Хоча ваше рішення було першим, що насправді спрацювало, @throws_exceptions_at_you створив відповідь з фактичним кодом, а не перенаправленням на документацію
Edenshaw

Я sudo pip installне знав збитків від його використання. Як я можу скасувати цю команду або блокувати для запуску sudo?
Emre Değirmenci

26

Ваша первісна проблема полягає в тому, що pip не може записати журнали в папку.

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

Вам потрібно ввести папку, в яку виклик процесу може писати /tmpтак, cd /tmpа повторна виклик команди, ймовірно, спрацює, але це не те, що ви хочете.

АЛЕ насправді для цього конкретного випадку (ви не хочете використовувати sudoдля встановлення пакунків python) і немає потреби в глобальній установці пакунків, ви можете використовувати --userпрапор так:

pip install --user <packagename>

і це буде працювати чудово.

Я припускаю, що у вас є одна установка python python і не хочете заважати читати про virtualenv (що не дуже зручно ) або pipenv .

Як зазначають деякі люди в розділі коментарів, наступний підхід не дуже гарна ідея, якщо ви не знаєте, що робити і застрягли:

Ще один підхід для глобальних пакетів, наприклад, у вашому випадку ви хочете зробити щось на кшталт:

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

або загалом

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

9
-1 Зміна власності на глобальну папку пакетів сайтів - це жахливо. У --userмоїй відповіді варіант піп був наданий як рішення, яке вже існувало, коли ви писали своє.
Пьотр Доброгост

1
Я не бачу тут аргументу. Враховуючи той факт, що хтось, хто задає таке запитання рівня входу, напевно, не знайомий із системою дозволів Unix, і тому працює інсталяція для 1 користувача, це не має значення. Крім того, ваша відповідь насправді не відповідає проблемі використання мене, ЩО ХОЧУ встановити на глобальні пакети. Після цього я міг легко відновити дозволи на попередню інсталяцію.
кидки_exceptions_at_you

2
+1 для фактичного написання цілих команд. Деякі люди припускають, що ОП знає, як реалізувати параметр у командному рядку, коли вони чи інші читачі цього не можуть. Ви не згодні, @PiotrDobrogost?
Дозвольте мені подумати про це

додавання --userдопомагає мені!
Honghao Zhang

2
Зміна дозволів для всього site-packagesкаталогу системи Python схожа на "фіксацію" насоса, ударивши його гайковим ключем. Це захищено з причини - ви не повинні встановлювати там речі . Реальне рішення не змішувати системи розподілу Python з програмуванням день у день. Встановіть інший дистрибутив Python (від Python.org, Homebrew, Canopy тощо).
charlesreid1

9

Оскільки у мене була така ж проблема, я хочу наголосити, що насправді перший коментар Брайана Каїна - це рішення "IOError: [Errno 13]" - проблема:

Якщо виконується в каталозі temp ( cd /tmp), IOError більше не виникає, якщо я запускаю sudo pip install foo.


2
Ви можете пояснити, чому це вирішує проблему для вас?
Кріс

8
ви все ще використовуєте sudo pipце "рішення" і таким чином встановлюєте пакети з привілеями root, що, мабуть, не те, що ви хочете?
Кріс

Я можу лише здогадуватися, чому це працює: я думаю, що деяка частина (деяких) сценаріїв встановлення піп вимагає доступу для запису до поточного каталогу, але з іншим користувачем. Тому, якщо він виконується, перебуваючи у вашому домашньому каталозі, він загадково виходить з ладу через відсутність доступу для запису. Якщо зателефонували зсередини, /tmpце працює, тому що всі мають доступ до запису.
Едгар

У нього немає доступу для запису до '/Users/markwalker/Library/Logs/pip.log'
bacs_exceptions_at_you

5

У мене виникла проблема virtualenvwrapperпісля успішної установки virtualenv.

Мій термінал поскаржився після цього:

pip install virtualenvwrapper

Отже, я безуспішно спробував це (НЕ РЕКОМЕНДУЄТЬСЯ) :

sudo pip install virtualenvwrapper

Потім я успішно встановив це за допомогою цього:

pip install --user virtualenvwrapper

Варіант --user для pip був заданий як рішення у моїй відповіді, яке вже існувало, коли ви писали своє. Це мав бути коментар, а не відповідь.
Пьотр Доброгост

Ви кажете НЕ рекомендується, але офіційні примітки про встановлення говорять ОК, щоб встановити virtualenvwrapper з sudo. Те саме стосується і virtualenv. Задане тут питання не стосується цих двох, тому я припускаю, що всі інші відповіді тут стосуються загальних пакетів python.
mehmet

Майбутнім читачам я перекреслив свій "не рекомендований" прапор у своїй відповіді через вищезазначений коментар, але ще не підтвердив його. Ось чому я ще не видалив прапор.
Дозвольте мені подумати про це

4

Схоже, ваші дозволи переплутані. Введіть chown -R markwalker ~термінал і спробуйте pipзнову? Повідомте мене, якщо ви відсортовані.


Хоча це може вирішити проблему дозволів, це не відповідає на питання.
Бурхан Халід

1
Вирішення проблем, які я не знав, що у мене є, це бонус! chownнадає Operation not permittedбагато прихованих режимів, як-то .shshі я припускаю, що це працює через файли, які він може встановити зараз, але я побачу, що станеться, коли кліп повернеться.
markwalker_
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.