Bagaimana menghindari "Izin ditolak" saat menggunakan pip dengan virtualenv

95

Saya mencoba untuk menerapkan paket Python pipdalam lingkungan virtual pada mesin Ubuntu, tetapi mengalami masalah terkait izin. Sebagai contoh:

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

diakhiri oleh:

kesalahan: tidak dapat membuat '/home/test/virtualenvs/TestVirtualEnv/lib/python3.3/site-packages/markdown2.py': Izin ditolak

Saya tidak bisa sudo, karena itu akan menginstal paket secara global, dan tidak dalam lingkungan virtual. Saya chowned site-packages; lshanya menampilkan direktori yang terkait dengan easy_install, pipdan setuptools, dan tidak ada yang terkait dengan Penurunan Harga.

Bagaimana cara menyebarkan paket di lingkungan virtual dengan piptanpa mengalami kesalahan terkait izin?

Arseni Mourzenko
sumber
Hanya untuk memperjelas: apakah Anda membuat virtualenv ini sudo?
sebastian_oe
@sebastian_oe: Saya yakin saya melakukannya. Saya akan membuat ulang satu untuk memastikan.
Arseni Mourzenko
4
Maka ini mungkin masalahnya. Coba buat virtualenv tanpa sudo.
sebastian_oe
1
@sebastian_oe: Saya membuat lingkungan virtual tanpa sudo. Memang, paket terinstal dengan benar sekarang. Tolong, bisakah Anda mempromosikan komentar Anda menjadi jawaban sehingga saya bisa menerimanya?
Arseni Mourzenko
1
Juga jika Anda beralih di antara pengguna yang berbeda, pastikan Anda menggunakan pengguna yang memiliki (atau memiliki akses tulis) virtualenvdirektori, karena Anda dapat mengaktifkan virtualenvdengan pengguna lain, tetapi tidak akan membiarkan Anda menginstal paket apa pun dan akan memberikan akses izin.
Andrius

Jawaban:

109

virtualenvmasalah izin mungkin terjadi saat Anda membuat virtualenvsebagai sudodan kemudian beroperasi tanpa sudodi virtualenv.

Seperti yang ditemukan dalam komentar pertanyaan Anda, solusi di sini adalah untuk membuat para virtualenvtanpa sudodapat kerja (esp. Write) di dalamnya tanpa sudo.

sebastian_oe
sumber
5
jika saya ingin membuatnya di / opt yang membutuhkan sudo, saya rasa virtualenv tidak akan diinstal tanpa sudo.
Umair A.
7
@sebastian_oe Saya rasa saya mencintaimu
Nobbynob Littlun
5
Bagaimana cara membuat virtualenvtanpa sudo?
Tunn
1
Jika Anda memang membuat virtualenv dengan sudo, lihat jawaban oleh @vingtoft untuk cara memperbaikinya dengan mudah tanpa membuat ulang
David A
106

Larutan:

Jika Anda membuat virtualenv sebagai root, jalankan perintah berikut:

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

Ini mungkin akan memperbaiki masalah Anda.

Bersulang

Vingtoft
sumber
1
Ini bekerja untuk saya (chown /usr/local/lib/python3.4), kecuali saya tidak berpikir saya telah membuat virtualenv sebagai root, saya sebenarnya telah menginstal Python3.4 sebagai root. Saya masih menguji, tetapi apakah menurut Anda saya akan mengalami masalah lagi dengan solusi ini, atau apakah chown ini akan memperbaiki sebagian besar kesalahan?
ntk4
3
Bagaimana Anda mengetahui apakah Anda telah membuat virtualenv atau python sebagai root?
A__
Ini memperbaiki masalah saya. Saya berada dalam situasi yang sama dengan OP di mana saya perlu membuat lingkungan virtual di / opt / direktori yang tidak dapat saya lakukan tanpa hak sudo.
sir_chocolate_soup
6

Dalam kasus saya, saya menggunakan mkvirtualenv, tetapi tidak memberi tahu bahwa saya akan menggunakan python3. Saya mendapat kesalahan ini:

mkvirtualenv hug
pip3 install hug -U

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

Ini bekerja setelah menentukan python3:

mkvirtualenv --python=/usr/bin/python3 hug
pip3 install hug -U
nealmcb.dll
sumber
5

Saya tidak membuat virtualenv saya menggunakan sudo. Jadi jawaban Sebastian tidak cocok untukku. Proyek saya disebut utils. Saya memeriksa utilsdirektori dan melihat ini:

-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

Seperti yang Anda lihat, utils.egg-infodimiliki oleh roottidak macuser. Itulah mengapa itu memberi saya permission deniedkesalahan. Saya juga harus menghapus /Users/macuser/.virtualenvs/armoury/lib/python2.7/site-packages/utils.egg-linkseperti yang dibuat oleh rootjuga. Saya melakukannya pip install -e .lagi setelah menghapusnya, dan berhasil.

AliBZ
sumber
3

Jika Anda membuat lingkungan virtual menggunakan root, gunakan perintah ini

sudo su

itu akan memberi Anda akses root dan kemudian mengaktifkan lingkungan virtual Anda menggunakan ini

source /root/.env/ENV_NAME/bin/activate
Dinesh Chandra Kumawat
sumber
1

Anda tidak mengaktifkan lingkungan virtual sebelum menggunakan pip.

Cobalah dengan:

$(your venv path) . bin/activate

Dan kemudian gunakan pip -r requirement.txt di folder utama Anda

jmrueda
sumber
1

Saya juga mengalami ini (secara tidak sengaja) setelah membuat venv baru saat berada di dalam lingkungan virtual yang ada. cara mudah untuk mendiagnosis ini adalah dengan melihat di mana pythonterhubung dengan symlink, yaitu jalankan:

ls -l venv/bin/python

dan pastikan itu menunjuk ke biner Python yang sesuai. Untuk sebagian besar sistem, ini akan menjadi /usr/bin/pythonatau /usr/bin/python3. sedangkan jika menunjuk ke lingkungan virtual yang ada, itu akan menjadi seperti /home/youruser/somedir/bin/python. jika itu yang terakhir daripada yang saya sarankan untuk membuat ulang venv sambil memastikan bahwa Anda tidak "di dalam" virtualenv yang ada (yaitu jalankan deactivate)

Sam Mason
sumber
diposting di sini karena ini adalah pertanyaan populer yang menyebutkan kata kunci yang sesuai, oleh karena itu lebih mungkin ditemukan dan berguna bagi orang lain
Sam Mason
0

Saat membuat virtualenv jika Anda menggunakan sudo, direktori dibuat dengan hak akses root. Jadi, saat Anda mencoba menginstal paket dengan pengguna non-sudo, Anda tidak akan memiliki izin untuk menginstalnya. Jadi selalu buat virtualenv tanpa sudo dan instal tanpa sudo.

Anda juga dapat menyalin paket yang diinstal pada python global ke virtualenv.

cp -r /lib/python/site-packages/* virtualenv/lib/python/site-packages/
Vkreddy Komatireddy
sumber
Ini bukanlah masalahnya: jika Anda membaca komentar, OP telah membuat virtual env dengan sudo sejak awal.
NickD