Как избежать отказа в доступе при использовании pip с virtualenv

95

Я пытаюсь развернуть пакет Python с помощью pipв виртуальной среде на машине Ubuntu, но сталкиваюсь с проблемой, связанной с разрешениями. Например:

(TestVirtualEnv)test@testServer:~$ pip install markdown2

заканчивается:

ошибка: не удалось создать '/home/test/virtualenvs/TestVirtualEnv/lib/python3.3/site-packages/markdown2.py': в разрешении отказано

Я не могу sudo, так как он установит пакет глобально, а не в виртуальной среде. Я chownизд site-packages; lsпоказывает только каталоги , связанные с easy_install, pipи setuptools, и ничто не связано с Markdown.

Как развернуть пакет в виртуальной среде pipбез ошибок, связанных с разрешениями?

Арсений Мурзенко
источник
Просто чтобы уточнить: вы создали этот virtualenv с помощью sudo?
sebastian_oe
@sebastian_oe: Думаю , да . Я воссоздаю один, чтобы быть уверенным.
Арсений Мурзенко
4
Тогда это может быть проблемой. Попробуйте создать virtualenv без sudo.
sebastian_oe
1
@sebastian_oe: Я создал виртуальную среду без sudo. Действительно, теперь пакет устанавливается правильно. Пожалуйста, не могли бы вы превратить свой комментарий в ответ, чтобы я мог его принять?
Арсений Мурзенко
1
Также, если вы переключаетесь между разными пользователями, убедитесь, что вы используете пользователя, который владеет (или имеет доступ на запись) virtualenvкаталог, потому что вы можете активировать virtualenvс другим пользователем, но он не позволит вам устанавливать какие-либо пакеты и предоставит доступ с разрешениями.
Андрюс

Ответы:

109

virtualenvПроблемы с разрешениями могут возникнуть, когда вы создаете virtualenvas, sudoа затем работаете без него sudoв virtualenv.

Как выяснилось , в комментарии на ваш вопрос, решение здесь , чтобы создатьvirtualenv без , sudoчтобы иметь возможность работы (особенно записи) в нем без sudo.

sebastian_oe
источник
5
если я хочу создать его в / opt, для чего требуется sudo, я думаю, что virtualenv не установится без sudo.
Умайр А.
7
@sebastian_oe Я думаю, что люблю тебя
Ноббиноб Литтлан
5
Как создать свой virtualenvбез sudo?
Tunn
1
Если вы создали virtualenv с помощью sudo, см. Ответ @vingtoft о том, как легко это исправить, не воссоздавая его
Дэвид А.
106

Решение:

Если вы создали virtualenv как root, выполните следующую команду:

sudo chown -R your_username:your_username path/to/virtuaelenv/

Вероятно, это решит вашу проблему.

Ура

Vingtoft
источник
1
Это сработало для меня (chown /usr/local/lib/python3.4), за исключением того, что я не думаю, что создал virtualenv как root, я фактически установил Python3.4 как root. Я все еще тестирую, но как вы думаете, у меня возникнут еще какие-либо проблемы с этим решением, или этот chown исправит большинство ошибок?
ntk4
3
Как узнать, создали ли вы virtualenv или python с правами root?
A__
Это устранило мою проблему. Я был в той же ситуации, что и OP, в том, что мне нужно было создать виртуальную среду в каталоге / opt /, что я не мог бы сделать без привилегий sudo.
sir_chocolate_soup
6

В моем случае я использовал mkvirtualenv, но не сказал, что собираюсь использовать python3. У меня такая ошибка:

mkvirtualenv hug
pip3 install hug -U

....
error: could not create '/usr/lib/python3.4/site-packages': Permission denied

Он работал после указания python3:

mkvirtualenv --python=/usr/bin/python3 hug
pip3 install hug -U
Nealmcb
источник
5

Я не создавал свой virtualenv с помощью sudo. Так что ответ Себастьяна ко мне не относился. Мой проект называется utils. Я проверил utilsкаталог и увидел это:

-rw-r--r--   1 macuser  staff   983  6 Jan 15:17 README.md
drwxr-xr-x   6 root     staff   204  6 Jan 14:36 utils.egg-info
-rw-r--r--   1 macuser  staff    31  6 Jan 15:09 requirements.txt

Как видите, utils.egg-infoпринадлежит rootnot macuser. Вот почему это давало мне permission deniedошибку. Мне также пришлось удалить, так /Users/macuser/.virtualenvs/armoury/lib/python2.7/site-packages/utils.egg-linkкак он был создан root. Я сделал это pip install -e .снова после удаления их, и это сработало.

AliBZ
источник
3

Если вы создали виртуальную среду с использованием root, используйте эту команду

sudo su

он предоставит вам root-доступ, а затем активирует вашу виртуальную среду с помощью этого

source /root/.env/ENV_NAME/bin/activate
Динеш Чандра Кумават
источник
1

Вы не активировали виртуальную среду перед использованием pip.

Попробуйте:

$(your venv path) . bin/activate

А затем используйте pip -r requirements.txt в своей основной папке

Jmrueda
источник
1

У меня также было это (случайно) после создания нового venv в существующей виртуальной среде. простой способ диагностировать это - увидеть, где pythonнаходится символическая ссылка, то есть запустить:

ls -l venv/bin/python

и убедитесь, что он указывает на соответствующий двоичный файл Python. Для большинства систем это будет /usr/bin/pythonили /usr/bin/python3. а если он указывает на существующую виртуальную среду, это будет что-то вроде /home/youruser/somedir/bin/python. если последнее, то я бы предложил воссоздать venv, убедившись, что вы не «внутри» какого-либо существующего virtualenv (т.е. запускаете deactivate)

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

При создании virtualenv, если вы используете sudo, каталог создается с правами суперпользователя, поэтому, когда вы пытаетесь установить пакет с пользователем, отличным от sudo, у вас не будет разрешения на установку в него. Поэтому всегда создавайте virtualenv без sudo и устанавливайте без sudo.

Вы также можете копировать пакеты, установленные на глобальном Python, в virtualenv.

cp -r /lib/python/site-packages/* virtualenv/lib/python/site-packages/
Вкредды Коматиредди
источник
Это не было проблемой: если вы читаете комментарии, OP изначально создал виртуальный env с помощью sudo.
NickD