pip install gagal dengan: OSError: [Errno 13] Izin ditolak pada direktori


123

pip install -r requirements.txtgagal dengan pengecualian di bawah ini OSError: [Errno 13] Permission denied: '/usr/local/lib/.... Apa yang salah dan bagaimana cara memperbaikinya? (Saya mencoba menyiapkan Django )

Installing collected packages: amqp, anyjson, arrow, beautifulsoup4, billiard, boto, braintree, celery, cffi, cryptography, Django, django-bower, django-braces, django-celery, django-crispy-forms, django-debug-toolbar, django-disqus, django-embed-video, django-filter, django-merchant, django-pagination, django-payments, django-storages, django-vote, django-wysiwyg-redactor, easy-thumbnails, enum34, gnureadline, idna, ipaddress, ipython, kombu, mock, names, ndg-httpsclient, Pillow, pyasn1, pycparser, pycrypto, PyJWT, pyOpenSSL, python-dateutil, pytz, requests, six, sqlparse, stripe, suds-jurko
Cleaning up...
Exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 122, in main
    status = self.run(options, args)
  File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 283, in run
    requirement_set.install(install_options, global_options, root=options.root_path)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 1436, in install
    requirement.install(install_options, global_options, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 672, in install
    self.move_wheel_files(self.source_dir, root=root)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 902, in move_wheel_files
    pycompile=self.pycompile,
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 206, in move_wheel_files
    clobber(source, lib_dir, True)
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 193, in clobber
    os.makedirs(destsubdir)
  File "/usr/lib/python2.7/os.py", line 157, in makedirs
    mkdir(name, mode)
OSError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/amqp-1.4.6.dist-info'

Terkait (khusus macOS / homebrew) stackoverflow.com/questions/33004708/…
wim

Jawaban:


76

Opsi a) Buat virtualenv, aktifkan dan instal:

virtualenv .venv
source .venv/bin/activate
pip install -r requirements.txt

Opsi b) Instal di homedir Anda:

pip install --user -r requirements.txt

Rekomendasi saya menggunakan opsi aman (a), sehingga persyaratan proyek ini tidak mengganggu persyaratan proyek lainnya.


2
Saya mendapat kesalahan seperti ini sudo:pip: command not foundpada contoh aws ec2 saya saat menjalankan perintah ini. Tolong bantu.
pengguna3768495

2
@ user3768495 Mungkin, pip tidak diinstal secara default. Distro mana EC2 Anda? Selain itu, python2 mungkin tidak diinstal, jadi Anda harus menginstal python2 atau menggunakan pip3. Berhati-hatilah dengan ini.
hectorcanto

33
Saya telah membaca ini tidak disarankan di banyak tempat sekarang. Sepertinya kita harus berhati-hati terhadap penggunaan sudo saat menjalankan pip (lihat jawaban Bert)
Justus Eapen

3
@JustusEapen: Saya tidak tahu bagaimana perasaan saya tentang itu. Menurut saya jawaban yang tepat untuk pertanyaan OP adalah manual tentang kebersihan komputer dasar, termasuk "jangan menjalankan kode teduh dengan izin pengguna super" dan "sikat gigi secara teratur". Saya menemukan jawaban optimal harus menunjukkan bahwa paket dapat diinstal pada setiap pengguna atau seluruh sistem, dan bahwa menginstal seluruh sistem, seperti yang diinginkan OP (ada alasan yang sangat kromulen untuk melakukannya) memerlukan izin pengguna super. Perhatian terhadap penginstalan paket di jalur sistem mungkin merupakan pekerjaan orang lain pada beberapa pertanyaan SO lainnya.
Tobia Tesan

8
downvoting karena sudosaran. Meskipun berhasil sekarang, ini akan membuat Anda banyak pusing di masa depan.
Gerald

318

Kita harus benar-benar berhenti menyarankan penggunaan sudowith pip install. Lebih baik mencoba dulu pip install --user. Jika ini gagal, lihat posting teratas di sini .

Alasan Anda tidak boleh menggunakan sudoadalah sebagai berikut:

Saat Anda menjalankan pip sudo, Anda menjalankan kode Python arbitrer dari Internet sebagai pengguna root, yang merupakan risiko keamanan yang cukup besar. Jika seseorang memasang proyek berbahaya di PyPI dan Anda menginstalnya, Anda memberikan akses root penyerang ke mesin Anda.


5
Pengamatan yang bagus. Itu, bagaimanapun, berlaku untuk semua sudo x install, untuk semua x(termasuk x = make).
Tobia Tesan

1
Ini juga memecahkan masalah saya. Apa yang dilakukan dengan menambahkan --user?
Miles Johnson

1
@MilesJohnson Menambahkan --usermenginstal paket di direktori home Anda, bukan di root. Memasang sesuatu ke lokasi ini tidak memerlukan hak ekstra apa pun.
bert

1
Selain itu, jika Anda berada di server jauh di belakang proxy, "sudo" mencegah Anda mengambil paket dari repositori internet dan / atau repositori git dari jaringan server jarak jauh.
Ataxias

2
Semua sebutan sudotelah dihapus setahun yang lalu. Jawaban ini sudah usang - harap perbarui dan perbarui. Anda juga perlu menyebutkan pemasangan per pengguna vs seluruh sistem, dan izin. Jangan gunakan jawaban Anda untuk secara langsung mengkritik jawaban lain, yang akan cenderung cepat usang.
smci

28

Anda mencoba menginstal paket di jalur seluruh sistem tanpa memiliki izin untuk melakukannya.

  1. Secara umum, Anda dapat menggunakan sudountuk sementara mendapatkan izin pengguna super atas tanggung jawab Anda untuk menginstal paket di jalur seluruh sistem:

     sudo pip install -r requirements.txt

    Temukan lebih banyak tentang di sudo sini .

    Sebenarnya, ini adalah ide yang buruk dan tidak ada kasus penggunaan yang baik untuk itu, lihat komentar @ wim.

  2. Jika Anda tidak ingin membuat perubahan di seluruh sistem, Anda dapat menginstal paket pada jalur per pengguna Anda menggunakan --usertanda.

    Yang dibutuhkan hanyalah:

     pip install --user runloop requirements.txt
  3. Terakhir, untuk kontrol yang lebih halus , Anda juga dapat menggunakan virtualenv , yang mungkin merupakan solusi terbaik untuk lingkungan pengembangan, terutama jika Anda mengerjakan banyak proyek dan ingin melacak dependensi masing-masing.

    Setelah mengaktifkan virtualenv Anda dengan

    $ my-virtualenv/bin/activate

    perintah berikut akan menginstal paket di dalam virtualenv (dan bukan di jalur seluruh sistem):

    pip install -r requirements.txt


4
Menjalankan pip dengan root disertai dengan risiko keamanan
Nrzonline

Menjalankan apa pun yang menjalankan kode dari Internet sebagai root memiliki risiko keamanan.
Tobia Tesan

Ini hampir merupakan jawaban terbaik, tetapi masih perlu diperbarui. a) Sekarang kami telah pyenv/pipenv, harus menyebutkan itu, dalam preferensi untuk virtualenv(atau conda-env) b) sudo dianggap berbahaya, dan lihat jawaban lain mengapa. Jadi letakkan jawaban berbasis env pertama, dan sudo yang terakhir, dengan pelepasan tanggung jawab besar.
smci

1
sudo pip install -r requirements.txttidak pernah benar. Lingkungan python sistem milik sistem, titik . Jika Anda menginstal lebih banyak barang python ke dalam sistem, melakukannya dengan manajer paket saja (misalnya sudo yum install, apt-get, dll ...) sejak mereka repo harus memiliki versi yang aman dan kompatibel perpustakaan berhasil.
wim

1
@TobiaTesan Kode lama sudo make install, biasanya dikompilasi + terkait, tidak benar-benar analog dengan sudo pip installsejak menginstal ke sistem Python env dapat membatalkan dependensi . Misalkan ada layanan sistem python-frobnicator, yang memiliki ketergantungan froblib(ini juga akan ada di pengelola paket dan disematkan ke versi yang kompatibel), dan kemudian Anda sudo pip installbeberapa aplikasi atau lib lain yang memiliki ketergantungan pada " froblib > 1.2". Pip dengan senang hati akan "mengupgrade" versi sistem froblibdengan yang lebih baru, yang mungkin tidak kompatibel / belum teruji dan merusak sistem.
wim

26

Hanya mengklarifikasi apa yang berhasil untuk saya setelah banyak kesulitan di linux (berbasis ubuntu) pada kesalahan izin ditolak, dan memanfaatkan jawaban Bert di atas, saya sekarang menggunakan ...

$ pip install --user <package-name>

atau jika menjalankan pip pada file persyaratan ...

$ pip install --user -r requirements.txt

dan ini bekerja dengan andal untuk setiap pemasangan pip termasuk membuat lingkungan virtual.

Namun, solusi terbersih dalam pengalaman saya selanjutnya adalah menginstal python-virtualenvdan virtualenvwrapperdengan sudo apt-get installdi tingkat sistem.

Kemudian, di dalam lingkungan virtual, gunakan pip installtanpa --userflag AND tanpa sudo. Jauh lebih bersih, lebih aman, dan lebih mudah secara keseluruhan.


Saya mendapatkan pesan "Tidak dapat melakukan instalasi '--user'. Paket situs pengguna tidak terlihat di virtualenv ini." kesalahan ketika mencoba menggunakanpip install --user -r requirements.txt
Amir A. Shabani

@ AmirA.Shabani jawabannya telah diedit sejak pertanyaan Anda. Sekarang dikatakan «di dalam lingkungan virtual, gunakan pip install tanpa tanda --user DAN tanpa sudo»
Daishi

7

Pengguna tidak memiliki izin menulis untuk beberapa jalur instalasi Python. Anda dapat memberikan izin dengan:

sudo chown -R $USER /absolute/path/to/directory

Jadi Anda harus memberi izin, lalu coba instal lagi, jika Anda memiliki jalur baru, Anda juga harus memberikan izin:

sudo chown -R $USER /usr/local/lib/python2.7/

2
Untuk python yang diinstal dengan brew, ini adalah jawaban yang tepat karena brew memelihara paket sebagai pengguna lokal (tanpa root).
idbrii

9
mengunyah direktori / usr / local bukanlah ide yang bagus. Ini bukan milik pengguna. Anda harus membaca tentang struktur file unix.
pengguna8162

6
Barang-barang di bawah /usrbiasanya dimiliki oleh root, hari ini. Mengunyah secara berulang dapat mengacaukan sistem Anda secara besar-besaran. HINDARI .
wim

0

Jika Anda membutuhkan izin, Anda tidak dapat menggunakan 'pip' dengan 'sudo'. Anda bisa melakukan trik, sehingga Anda bisa menggunakan 'sudo' dan menginstal paket. Letakkan saja 'sudo python -m ...' di depan perintah pip Anda.

sudo python -m pip install --user -r package_name

Tampaknya baik-baik saja bagi saya, tetapi bisakah Anda menambahkan penjelasan.
pythonic833

-1

Jadi, saya mendapatkan kesalahan yang sama persis karena alasan yang sama sekali berbeda. Karena bug Homebrew + pip yang benar-benar terpisah, tetapi diketahui , saya telah mengikuti solusi ini yang tercantum di dokumen bantuan Google Cloud, tempat Anda membuat file .pydistutils.cfg di direktori beranda Anda. File ini memiliki konfigurasi khusus yang seharusnya hanya Anda gunakan untuk menginstal pustaka tertentu. Saya seharusnya menghapus file disutils.cfg itu setelah menginstal paket, tetapi saya lupa melakukannya. Jadi perbaikan bagi saya sebenarnya hanya ...

rm ~/.pydistutils.cfg.

Dan kemudian semuanya bekerja seperti biasa. Tentu saja, jika Anda memiliki beberapa konfigurasi di file itu karena alasan yang sebenarnya, maka Anda tidak ingin langsung meng-rm file itu. Tetapi jika ada orang lain yang melakukan solusi itu, dan lupa menghapus file itu, ini melakukan trik untuk saya!


-1

Itu karena masalah izin,

sudo chown -R $USER /path to your python installed directory

default itu akan /usr/local/lib/python2.7/

atau coba,

pip install --user -r package_name

dan kemudian berkata, pip install -r requirements.txtini akan menginstal di dalam env Anda

jangan katakan, sudo pip install -r requirements.txtini akan menginstal ke jalur python sewenang-wenang.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.