Jak uniknąć „Odmowa uprawnień” podczas używania pip z virtualenv

95

Próbuję wdrożyć pakiet Pythona pipw środowisku wirtualnym na maszynie Ubuntu, ale napotykam problem związany z uprawnieniami. Na przykład:

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

kończy się:

błąd: nie można utworzyć '/home/test/virtualenvs/TestVirtualEnv/lib/python3.3/site-packages/markdown2.py': Odmowa uprawnień

Nie mogę sudo, ponieważ zainstaluje pakiet globalnie, a nie w środowisku wirtualnym. I chowned site-packages; lstylko pokazuje katalogi związane easy_install, pipi setuptools, i nic związane z promocji cenowych.

Jak wdrożyć pakiet w środowisku wirtualnym pipbez napotkania błędów związanych z uprawnieniami?

Arseni Mourzenko
źródło
Dla wyjaśnienia: czy stworzyłeś ten virtualenv z sudo?
sebastian_oe
@sebastian_oe: Myślę , że tak. Na pewno go odtworzę.
Arseni Mourzenko
4
To może być problem. Spróbuj utworzyć virtualenv bez sudo.
sebastian_oe
1
@sebastian_oe: Stworzyłem środowisko wirtualne bez sudo. Rzeczywiście, pakiet instaluje się teraz poprawnie. Czy możesz promować swój komentarz jako odpowiedź, abym mógł go zaakceptować?
Arseni Mourzenko
1
Ponadto, jeśli przełączasz się między różnymi użytkownikami, upewnij się, że używasz użytkownika, który jest właścicielem virtualenvkatalogu (lub ma virtualenvprawo do zapisu) , ponieważ możesz aktywować go z innym użytkownikiem, ale nie pozwoli ci to zainstalować żadnych pakietów i da uprawnienia dostępu.
Andrius,

Odpowiedzi:

109

virtualenvProblemy z uprawnieniami mogą wystąpić podczas tworzenia virtualenvas, sudoa następnie działania bez sudow virtualenv.

Jak dowiedziałeś się w komentarzu do pytania, rozwiązaniem jest tutaj utworzenie strony virtualenvbez, sudoaby móc w niej pracować (zwłaszcza pisać) bez sudo.

sebastian_oe
źródło
5
jeśli chcę utworzyć go w / opt, który wymaga sudo, myślę, że virtualenv nie zainstaluje się bez sudo.
Umair A.
7
@sebastian_oe Myślę, że cię kocham
Nobbynob Littlun
5
Jak stworzyć virtualenvbez sudo?
Tunn,
1
Jeśli utworzyłeś virtualenv za pomocą sudo, zobacz odpowiedź @vingtoft, aby dowiedzieć się, jak łatwo to naprawić bez ponownego tworzenia
David A
106

Rozwiązanie:

Jeśli utworzyłeś virtualenv jako root, uruchom następujące polecenie:

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

To prawdopodobnie rozwiąże Twój problem.

Twoje zdrowie

Vingtoft
źródło
1
To zadziałało dla mnie (chown /usr/local/lib/python3.4), z wyjątkiem tego, że nie sądzę, że utworzyłem virtualenv jako root, tak naprawdę zainstalowałem Python3.4 jako root. Wciąż testuję, ale czy myślisz, że napotkam więcej problemów z tym rozwiązaniem, czy też ten chown naprawi większość błędów?
ntk4
3
Jak dowiesz się, czy utworzyłeś virtualenv lub python jako root?
A__
To rozwiązało mój problem. Byłem w podobnej sytuacji jak OP, ponieważ musiałem stworzyć wirtualne środowisko w katalogu / opt /, którego nie mogłem obejść bez uprawnień sudo.
sir_chocolate_soup
6

W moim przypadku mkvirtualenvużywałem, ale nie powiedziałem, że będę używał python3. Mam ten błąd:

mkvirtualenv hug
pip3 install hug -U

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

Zadziałało po określeniu python3:

mkvirtualenv --python=/usr/bin/python3 hug
pip3 install hug -U
nealmcb
źródło
5

Nie stworzyłem swojego virtualenv za pomocą sudo. Więc odpowiedź Sebastiana mnie nie dotyczyła. Mój projekt nazywa się utils. Sprawdziłem utilskatalog i zobaczyłem to:

-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

Jak widać, utils.egg-infojest własnością rootnie macuser. Dlatego dawało mi to permission deniedbłąd. Musiałem też usunąć, /Users/macuser/.virtualenvs/armoury/lib/python2.7/site-packages/utils.egg-linkponieważ został stworzony przez root. Zrobiłem to pip install -e .ponownie po usunięciu tych i zadziałało.

AliBZ
źródło
3

Jeśli utworzyłeś środowisko wirtualne za pomocą roota, użyj tego polecenia

sudo su

da ci dostęp do roota, a następnie aktywuje twoje wirtualne środowisko za jego pomocą

source /root/.env/ENV_NAME/bin/activate
Dinesh Chandra Kumawat
źródło
1

Nie aktywowano środowiska wirtualnego przed użyciem pip.

Wypróbuj z:

$(your venv path) . bin/activate

Następnie użyj pip -r Requirements.txt w swoim głównym folderze

jmrueda
źródło
1

Zdarzyło mi się to również (przez przypadek) po utworzeniu nowego venv w istniejącym środowisku wirtualnym. prostym sposobem na zdiagnozowanie tego byłoby sprawdzenie, gdzie pythonjest dowiązanie symboliczne, tj. uruchomienie:

ls -l venv/bin/python

i upewnij się, że wskazuje odpowiedni plik binarny Pythona. W przypadku większości systemów będzie to /usr/bin/pythonlub /usr/bin/python3. podczas gdy jeśli wskazuje na istniejące środowisko wirtualne, będzie to coś podobnego /home/youruser/somedir/bin/python. jeśli to drugie, to sugerowałbym odtworzenie venv, upewniając się, że nie jesteś „wewnątrz” żadnego istniejącego virtualenv (tj. uruchom deactivate)

Sam Mason
źródło
zamieszczone tutaj, ponieważ jest to popularne pytanie, które wymienia odpowiednie słowa kluczowe, dlatego jest bardziej prawdopodobne, że zostanie znalezione i przydatne dla innych osób
Sam Mason
0

Podczas tworzenia virtualenv, jeśli używasz sudo, katalog jest tworzony z uprawnieniami roota, więc gdy spróbujesz zainstalować pakiet z użytkownikiem innym niż sudo, nie będziesz mieć uprawnień do instalacji w nim. Dlatego zawsze twórz virtualenv bez sudo i instaluj bez sudo.

Możesz także skopiować pakiety zainstalowane w globalnym języku Python do virtualenv.

cp -r /lib/python/site-packages/* virtualenv/lib/python/site-packages/
Vkreddy Komatireddy
źródło
To nie był problem: jeśli przeczytałeś komentarze, OP stworzył wirtualne środowisko z sudo w pierwszej kolejności.
NickD