Допустимо и безопасно запускать pip install под sudo?

115

Я начал использовать свой 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Следует избегать бега без крайней необходимости.

markwalker_
источник
12
Я считаю, что ' cd /tmp; sudo pip install foo' - адекватный обходной путь.
Брайан Кейн
1
Возможный дубликат Каковы риски запуска sudo pip?
pradyunsg
@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.

Лучше всего использовать виртуальную среду, которая изолирует пакеты за вас. Таким образом, вы можете поиграть, не загрязняя глобальную установку python.

В качестве бонуса virtualenv не требует повышенных разрешений.

Бурхан Халид
источник
2
Если его права доступа к домашнему каталогу испорчены , использование virtualenv вряд ли поможет ему
hd1
1
Да, будет, но это уже произошло, поэтому ему нужно исправить это, прежде чем продолжить.
hd1
1
Спасибо, ребята, я читал о virtualenv раньше, так что надеюсь, что эти два решения вместе вернут меня в нужное русло :)
markwalker_
1
также для установки virtualenv вам нужно sudo ... или есть обходной путь?
jimijazz
9
Я не понимаю, почему это лучший ответ. Вопрос НЕ о виртуальных средах. Дело в правомерности использования sudo pip install. Допустим, мне нужно установить какой-то пакет, который я буду использовать во многих проектах или на системном уровне. Например, какой-то инструмент CLI, например pgcli. Очевидно, мне не нужен для этого виртуальный env, я хочу установить его глобально. Стоит ли использовать sudo pip installили есть более правильные методы? Вот в чем вопрос.
Alex Belyaev
42

Приемлемо ли и безопасно ли работать pip installпод ним sudo?

Это небезопасно, и к этому относятся неодобрительно - см. Каковы риски запуска sudo pip? Чтобы установить пакет Python в домашний каталог, вам не нужны права root. См описания в --userопции для пипа.

Петр Доброгост
источник
Хотя ваше решение было первым, которое действительно сработало, @throws_exceptions_at_you создал ответ с реальным кодом, а не перенаправлением на документацию
Эденшоу,
Я 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 для одного пользователя, и вы не хотите беспокоиться о чтении о virtualenv (что не очень удобно для пользователя) или pipenv .

Как отмечали некоторые люди в разделе комментариев, следующий подход - не очень хорошая идея, если вы не знаете, что делать, и застряли:

Другой подход для глобальных пакетов, например, в вашем случае, вы хотите сделать что-то вроде:

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

или в более общем смысле

chown -R $USER <path to your global pip packages>
throws_exceptions_at_you
источник
9
-1 Смена владельца глобальной папки сайтов-пакетов - ужасное дело. --userВариант для пип был дан в виде раствора в моем ответе , который уже существовал , когда вы писали ваши.
Петр Доброгост
1
Я не вижу здесь аргументов. Также с учетом того факта, что тот, кто задает такой вопрос начального уровня, вероятно, не знаком с системой разрешений unix и, следовательно, запускает установку для одного пользователя, это не имеет значения. Кроме того, ваш ответ на самом деле не соответствует варианту использования, когда я действительно ХОЧУ установить в глобальные пакеты. После этого я мог легко вернуть разрешения к предустановке.
throws_exceptions_at_you
2
+1 за написание целых команд. Некоторые люди предполагают, что OP знает, как реализовать параметр в командной строке, хотя они или другие читатели не могут. Вы не согласны, @PiotrDobrogost?
Позвольте мне подумать об этом
добавление --userмне помогает!
Хунхао Чжан,
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, что, вероятно, не то, что вам нужно?
Крис
Я могу только догадываться, почему это работает: я думаю, что для некоторой части (некоторых) сценариев установки pip требуется доступ на запись в текущий каталог, но с другим пользователем. Следовательно, если он выполняется в вашем домашнем каталоге, он загадочным образом не работает из-за отсутствия доступа для записи. Если /tmpвызывается изнутри, он работает, потому что у всех есть доступ на запись.
Эдгар
У него нет доступа на запись в '/Users/markwalker/Library/Logs/pip.log'
throws_exceptions_at_you
5

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

Мой терминал пожаловался после того, как я сделал это:

pip install virtualenvwrapper

Итак, я безуспешно пробовал это (НЕ РЕКОМЕНДУЕТСЯ) :

sudo pip install virtualenvwrapper

Затем я успешно установил его следующим образом:

pip install --user virtualenvwrapper
Позвольте мне подумать об этом
источник
Параметр --user для pip был указан в моем ответе как решение, которое уже существовало, когда вы писали свой. Это должен был быть комментарий, а не ответ.
Петр Доброгост
вы говорите НЕ рекомендуется, но официальных примечаниях к установке говорится, что можно установить virtualenvwrapper с помощью sudo. То же самое и с virtualenv. Заданный здесь вопрос не относится к этим двум, поэтому я предполагаю, что все остальные ответы здесь относятся к общим пакетам python.
мехмет
Будущим читателям: я вычеркнул свой флаг "не рекомендуется" в своем ответе из-за вышеприведенного комментария, но я еще не проверил его. Вот почему я еще не удалил флаг.
Позвольте мне подумать об этом
4

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

hd1
источник
Хотя это может решить проблему с разрешениями, это не дает ответа на вопрос.
Бурхан Халид
1
Решение проблем, о которых я не знал, - это бонус! chownдает Operation not permittedмного скрытых каталогов, таких как .shsh& я предполагаю, что он работает с файлами, которые он может установить сейчас, но я посмотрю, что произойдет, когда вернется приглашение cli.
markwalker_