Як уникнути "Дозвіл відмовлено" при використанні pip з virtualenv


93

Я намагаюся розгорнути пакет 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без помилок, пов’язаних з дозволами?


Тільки для уточнення: чи створювали ви цей віртуальний за допомогою sudo?
sebastian_oe

@sebastian_oe: Я вважаю, що зробив. Я відтворю його, щоб бути впевненим.
Арсені Мурзенко

4
Тоді це може бути проблемою. Спробуйте створити virtualenv без sudo.
sebastian_oe

1
@sebastian_oe: Я створив віртуальне середовище без sudo. Справді, зараз пакет інсталюється правильно. Будь ласка, чи можете ви перекласти свій коментар на відповідь, щоб я міг його прийняти?
Арсені Мурзенко

1
Крім того, якщо ви перемикаєтесь між різними користувачами, переконайтеся, що ви використовуєте користувача, який володіє (або має доступ до запису) virtualenvкаталог, тому що ви можете активувати virtualenvз іншим користувачем, але це не дозволить вам встановлювати будь-які пакети і надасть дозвіл на доступ.
Андрій,

Відповіді:


106

virtualenvпроблеми з дозволом можуть виникати, коли ви створюєте файл virtualenvas, sudoа потім працюєте без sudoв virtualenv.

Як з'ясувалося , в коментарі на ваше запитання, рішення тут , щоб створитиvirtualenv без , sudoщоб мати можливість роботи (особливо записи) в ньому без sudo.


4
якщо я хочу створити його в / opt, який вимагає sudo, я думаю, virtualenv не встановить без sudo.
Umair A.

7
@sebastian_oe Я думаю, що я тебе люблю
Nobbynob Littlun

5
Як створити virtualenvбез sudo?
Тунн

Якщо ви все-таки створили virtualenv за допомогою sudo, див. Відповідь @vingtoft про те, як це легко виправити, не відтворюючи
David A

103

Рішення:

Якщо ви створили virtualenv як root, запустіть таку команду:

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

Це, мабуть, вирішить вашу проблему.

Ура


1
Це спрацювало для мене (chown /usr/local/lib/python3.4), за винятком того, що я не думаю, що я створив virtualenv як root, я фактично встановив Python3.4 як root. Я все ще тестую, але як ви думаєте, я ще не зіткнуся з будь-якими проблемами з цим рішенням, чи цей чаун виправить більшість помилок?
ntk4

3
Як дізнатись, чи створили ви virtualenv або python як root?
A__

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

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належить rootне macuser. Ось чому це дало мені permission deniedпомилку. Мені також довелося видалити, /Users/macuser/.virtualenvs/armoury/lib/python2.7/site-packages/utils.egg-linkоскільки це було створено rootтакож. Я pip install -e .знову зробив це після видалення, і це вдалося .


3

Якщо ви створили віртуальне середовище за допомогою root, використовуйте цю команду

sudo su

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

source /root/.env/ENV_NAME/bin/activate

1

Ви не активували віртуальне середовище до використання pip.

Спробуйте за допомогою:

$(your venv path) . bin/activate

А потім використовуйте pip -r requirements.txt у вашій головній папці


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, каталог створюється з правами root, тому при спробі встановити пакет із несудокористувачем ви не матимете дозволу на встановлення в нього. Тому завжди створюйте virtualenv без sudo та встановлюйте без sudo.

Ви також можете скопіювати пакунки, встановлені на глобальному python, у virtualenv.

cp -r /lib/python/site-packages/* virtualenv/lib/python/site-packages/

Це не була проблема: якщо ви прочитаєте коментарі, OP створив віртуальну env із sudo, насамперед.
NickD
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.