Почему я не могу делать некоторые вещи без sudo с помощью Python и pip?

когда я использую pip, он обычно не работает без sudo. Я часто вижу, как люди используют pip без sudo, так что я делаю неправильно?

Я читал, что не рекомендуется устанавливать пакеты pip с sudo. Я знаю это с virtualenv Я могу использовать pip без sudo, но установить virtualenv сначала я должен использовать sudo.

когда я пытаюсь установить pip без sudo, я получаю:

PermissionError: [Errno 13] Permission denied: '/usr/local/lib/python3.4/dist-packages/pip'

при попытке установить колбу с pip3 install flask:

PermissionError: [Errno 13] Permission denied: '/usr/local/lib/python3.4/dist-packages/werkzeug'

2 ответов


sudo используется в системах Unix/Linux для выполнения задач от имени другого пользователя, используя их разрешения, такие как возможность записи в определенные каталоги. Когда вы не указываете пользователя для эмуляции, например, при запуске

sudo pip install flask

вы пытаетесь выполнить команду системного администратора, известного как root во многих средах. Вам будет предложено ввести пароль администратора (который может быть вашим, если вы дали ваш пользователь права администратора), затем указанная команда запускает как пользователь, что означает, что он имеет доступ для чтения/записи практически к каждому файлу и каталогу в системе (есть некоторые исключения, но они в основном угловые случаи и не очень важны здесь). Это означает, что вам нужно быть очень осторожны при использовании sudo, как ошибка, такая же маленькая, как одно пространство, может действительно испортить вещи: сравните

sudo rm -rf /usr/local/lib/python3.4/dist-packages/numpy*

С

sudo rm -rf /usr /local/lib/python3.4/dist-packages/numpy*

видим, что пространство между /usr и local/? Вы только начали удалять все /usr папка, которая содержит большую часть жизненно важных файлов и программ в системе. Надеюсь, у вас есть резервная копия! Теперь это не означает, что вам нужно бояться до смерти sudo, а ты do нужно иметь здоровое уважение к нему.

установки Python имеют тенденцию быть системными (да, я знаю, что есть исключения), что означает, что вам нужно использовать sudo изменить их, например, когда установка сторонних модулей с помощью pip. Если вы бежите

ls -l /usr/local/lib/python3.4 

вы увидите что-то вроде

drwxrwsr-x 125 root 4096 Nov  3 00:40 dist-packages

показывает, что каталог, который вы пытаетесь установить с pip принадлежит root, поэтому использование sudo необходимо.

теперь есть несколько способов обойти это. Если вам это удобно и вы не возражаете против изменения глобальных пакетов системы, используйте sudo С pip (на самом деле, вам может понадобиться использовать sudo -H ... если вы получите небольшое сообщение желтого цвета в начале о разрешениях в вашем домашнем каталоге). Все ваши модули будут установлены в /usr/local/lib/python3.4/dist-packages и быть доступным для всех пользователей в системе.

второй вариант-использовать PIP в --user опция, которая создаст lib/python3.4/site-packages иерархия в вашем домашнем каталоге (~) и хранить любые установленные модули там, а также скрипты в ~/bin (который вы должны добавить в свой $PATH. Этот преимущество этого метода в том, что вы не нужно использовать sudo, поэтому вы случайно не перезаписываете зависящие от системы модули, где для запуска других программ требуются определенные версии. Недостатком является то, что установленные модули доступны только вам, поэтому вы мая запускаются проблемы, если, например, ваш веб-сервер пытается запустить Flask как сам и не может прочитать исходные файлы. Однако это ничего, что небольшое редактирование файла конфигурации не может исправить. Это мое рекомендуемое решение для большинства пользователей.

третий вариант-использовать виртуальные среды, такие как virtualenv. Это создаст пользовательскую установку Python в выбранном вами месте с отдельные python исполняемый файл и site-packages иерархия (есть варианты того, хотите ли вы связать или использовать dist-packages репозитории). Ты можешь!--31--> пакеты сразу в virtualenv, и делают так много окружающих сред как пожелает ваше маленькое сердце, каждый с немного разными версиями различных зависимостей, например, чтобы вы могли более надежно тестировать свои программы. Вы можете включать и выключать виртуальные среды, например, у вас может быть пара, работающих на разных вкладках терминала, например, тестирование вещей параллельно. Это моя вторая рекомендация, потому что (немного) больше работы связано с активацией и использованием сред, и вы можете запутаться в том, что тот, в котором вы работаете, если вы не очень хорошо называете их. К недостаткам относятся отсутствие общесистемной доступности, как и второй вариант, и тот факт, что виртуальная среда должна быть активирована вручную перед использованием.

Итак, взгляните на варианты, и увидеть, что лучше для вашей системы и вашей конкретной ситуации. Удачи!


причина в том, что ваш обычный пользователь не имеет разрешений, необходимых для изменения системных каталогов. Как в этом сообщении:

PermissionError: [Errno 13] Permission denied: '/usr/local/lib/python3.4/dist-packages/pip'

вот краткое изложение того, что вам нужно знать:

в вашей системе установлен python, чтобы изменить python системы, вы должны использовать sudo или быть пользователем root.

вы можете установить библиотеки python в свой домашний каталог без использования sudo, но только вы (не другие пользователи системы) будете уметь им пользоваться. Сделайте это с pip install --user package-name Как упоминалось в gongzhitaao.

вы также можете создавать уникальные установки python в каталоге по вашему выбору, как упомянутый Смеющийся человек. Это называется virtualenv, и я думаю, что это наиболее предпочтительный способ работы.