Setelah pembaruan El Capitan, saya tidak dapat menjalankan instalasi pip. Kesalahan yang saya dapatkan adalah bahwa "operasi tidak diizinkan" ketika pip mencoba membuat folder baru saat menginstal.
creating /System/Library/Frameworks/Python.framework/Versions/2.7/share
error: could not create '/System/Library/Frameworks/Python.framework/Versions/2.7/share': Operation not permitted
Bahkan, secara umum saya tidak dapat membuat folder, dll di folder ini. Sudah mencoba menggunakan sudo yang tidak membantu. Saya juga sudah melakukannya
sudo chflags nouchg /System/Library/Frameworks/Python.framework/Versions/2.7/
Di atas juga tidak membantu. Apa yang bisa saya lakukan untuk dapat menginstal pustaka python dengan lancar lagi?
macos
el-capitan
permission
python
authorization
web_ninja
sumber
sumber
Jawaban:
Sebuah solusi cepat adalah dengan menggunakan homebrew untuk menginstal
python
ke dalam/usr/local/bin
sehingga Andapip
dapat dijalankan terhadap kerangka python dimodifikasi-friendly.Menonaktifkan Perlindungan Integritas Sistem juga merupakan pilihan, tetapi saya tidak merekomendasikan itu untuk apa pun kecuali server yang dikelola secara profesional dan memecat di mana Anda memiliki tenaga untuk mengelola deteksi intrusi atau jika Anda seorang pengembang / sysadmin dan perlu menguji berbagai hal dengan dan tanpa MENYESAP.
Anda akan melihat bahwa bendera terbatas diatur yang tidak dapat dihapus bahkan sebagai root saat SIP diaktifkan.
Menggunakan homebrew memungkinkan untuk mengelola pip dan python secara terpisah dari versi sistem yang disediakan. Sebagai bonus, kerangka kerja homebrew dirancang untuk memudahkan perawatan dan menambal / tugas melalui otomatisasi.
sumber
brew install python
adalah opsi paling sederhana, meskipun membersihkan beberapa pengaturan lain mungkin diperlukan jika Anda telah menggunakan sistem Python untuk beberapa waktu (misalnya file Python yang dimiliki oleh root di bawah/usr/local/bin
dan~/Library/Caches/pip
)brew
karena mudah untuk menyematkan versi yang Anda suka - mengelola beberapa versi yang berbeda atau menjaga hal-hal diperbarui secara berkala. Namun, jika Anda memiliki sesuatu yang sesuai untuk Anda - sulit untuk diperdebatkan bahwa Anda harus mengubah apa pun.Opsi lain yang layak tanpa harus menonaktifkan SIP atau menginstal versi Python lainnya, adalah menginstal modul hanya untuk pengguna saat ini menggunakan
Jika ini hanya mesin pribadi Anda, ini akan menjadi solusi paling sederhana dan teraman.
sumber
Masalah ini sering muncul ketika pip mencoba menginstal halaman manual untuk IPython pada El Capitan. Perbaikan cepat adalah dengan menggunakan perintah pip seperti ini:
Namun, Perlindungan Integritas Sistem (SIP) pada El Capitan memblokir beberapa praktik buruk dengan pip yang digunakan untuk meluncur, jadi Anda mungkin perlu melakukan beberapa perubahan agar pip berjalan dengan lancar di El Capitan.
SIP pada El Capitan memaparkan tiga masalah dengan menggunakan pip dengan versi Python yang disediakan Apple pada OS X:
distutils tidak menetapkan dua variabel penting dengan benar di Mac, jadi pip mencoba menulis header dan file bersama lainnya (misalnya, halaman manual) di bawah
/System/Library/Frameworks/Python.framework/Versions/2.7/
. Ini adalah ide yang buruk, tetapi dalam versi OS X sebelumnya, itu berhasil jika pip dijalankan dengan sudo. Namun gagal pada El Capitan karena SIP. Ini adalah kesalahan yang Anda temui. Ini memberi pesan sepertiOSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'
Apple menginstal versi lama dari beberapa paket di
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
(misalnya, enam). Pada versi OS X sebelumnya, ketika Anda menginstal sebuah paket yang membutuhkan versi yang lebih baru dari salah satunya,sudo pip
akan secara diam-diam menghapus versi lama dari/System/
folder dan menginstal versi yang lebih baru di/Library/Python/2.7/site-packages
. Ini juga ide yang buruk, dan tidak mungkin lagi dengan SIP. Tapi sekarang pip akan crash dengan pesan kesalahan saat mencoba menghapus paket lama. Pesan itu jugaOSError: [Errno: 1]
, tetapi datang setelah pesan sepertiUninstalling six-1.4.1:
. Lihat, misalnya, https://github.com/pypa/pip/issues/3165 .Versi Apple dari Python menambahkan beberapa direktori di bawah
/System/Library/Frameworks/Python.framework/Versions/2.7/
ke jalur pencarian python di atas lokasi instalasi paket yang dapat diakses pengguna. Jadi, jika Anda menginstal versi yang lebih baru dari paket di tempat lain (misalnya,sudo -H pip install --ignore-installed six
), Anda akan mendapatkan pesan bahwa instalasi berhasil, tetapi kemudian ketika Anda menjalankan python Anda akan mendapatkan versi yang lebih lama/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
. Ini juga membuat tidak mungkin untuk menggunakan paket baru yang memiliki nama yang sama dengan modul dari pustaka standar.Anda dapat mengatasi masalah ini, tetapi metode ini tergantung pada jawaban Anda untuk tiga pertanyaan.
/Library/Python/2.7/site-packages
dan semua skrip yang diinstal/usr/local/bin
untuk paket-paket tersebut (termasuk pip). Kalau tidak, Anda akan memiliki pengalaman yang menjengkelkan dari beberapa skrip mengakses versi Python yang diinstal sistem dan beberapa mengakses instalasi Anda sendiri.Jika Anda ingin tetap menggunakan Python yang diinstal sistem, maka Anda harus membuat dua keputusan lagi:
Apakah Anda ingin menginstal paket untuk semua pengguna, atau hanya untuk Anda sendiri? Menginstal untuk semua pengguna memastikan bahwa setiap program yang menggunakan Python (termasuk skrip administratif yang mungkin) akan memiliki akses ke semua paket yang Anda instal. Namun, ada kemungkinan jauh bahwa itu akan mengganggu penggunaan El Capitan sendiri atas Python. (Saya berharap Apple menggunakan
python -S
untuk memastikan mereka selalu mendapatkan paket yang mereka harapkan, tapi saya tidak punya cara untuk menguji ini.) Menginstal hanya untuk akun pengguna Anda sendiri menghilangkan kemungkinan mengganggu sistem instalasi Python. Catatan: jika Anda akan beralih dari instalasi seluruh sistem ke hanya pengguna, Anda mungkin harus mengambil kesempatan ini untuk menghapus instalasi apa pun yang saat ini diinstal/Library/Python/2.7/site-packages
dan skrip terkait/usr/local/bin
.Apakah Anda ingin menyembunyikan paket tambahan yang diinstal dengan versi Python OS X (di bawah
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
), atau menyimpannya di jalur pencarian? Saya sarankan menyembunyikannya, sehingga versi terbaru dari paket-paket ini secara otomatis akan diinstal di lokasi yang dapat diakses pengguna bila diperlukan. Jika Anda tidak menyembunyikan direktori ini, maka Anda sesekali akan mendapatkan pesan bahwa pip tidak dapat menghapus paket yang ada untuk meningkatkannya ke versi yang lebih baru (diperlukan oleh paket lain yang Anda instal). Dalam hal ini, Anda harus menjalankanpip install --ignore-installed <package>
, yang akan menginstal versi yang lebih baru dan menyembunyikan versi yang diinstal sistem. Namun, jika Anda menyembunyikan keseluruhannya/System/.../Extras/...
direktori, Anda akan kehilangan akses ke beberapa paket Apple yang tidak tersedia melalui pip, yaitu, CoreGraphics dan bonjour. (Jika Anda membutuhkan ini, Anda mungkin bisa mendapatkan akses dengan menghubungkannya ke direktori paket situs Anda.)Sekarang, inilah solusinya. Ini akan menjadi praktik yang baik pada semua versi OS X, untuk menghindari mengganti atau menghapus paket Python yang digunakan oleh sistem operasi; namun mereka sangat penting jika Anda ingin menggunakan paket yang diinstal pengguna dengan versi Python yang disediakan Apple pada OS X El Capitan (10.11).
Pasang pip
Anda mungkin sudah melakukannya, tetapi jika tidak, Anda dapat menggunakan perintah berikut untuk menginstal pip untuk semua pengguna :
Atau gunakan perintah ini untuk menginstal pip hanya untuk akun pengguna Anda sendiri :
Kelola Lokasi File Bersama
Jika Anda menginstal paket untuk semua pengguna, buat file bernama .pydistutils.cfg dengan baris-baris ini (dari https://github.com/pypa/pip/issues/426 ):
Jika Anda biasanya menggunakan
sudo -H pip ...
, maka Anda harus meletakkan file ini di/var/root
(direktori home untuk pengguna root). Jika Anda biasanya menggunakansudo pip ...
, maka Anda harus meletakkan file ini di direktori home Anda sendiri (~).Pengaturan ini akan mencegah pip dari mencoba menulis item bersama seperti header dan halaman manual di bawah
/Library/System
. (Perintah di bagian atas jawaban ini adalah versi yang lebih cepat dari hal yang sama.) Pengaturan ini diperlukan karena kode khusus darwin/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.py
gagal mengatur variabel-variabel ini ke lokasi root-writeable (walaupun ia mengatur variabel lain dengan benar). Ada informasi lebih lanjut tentang ini di https://github.com/pypa/pip/issues/3177 .Jika Anda menginstal paket hanya untuk akun pengguna Anda sendiri, item yang dibagikan akan diinstal secara otomatis di bawah
~/Library/Python/2.7/
. Tetapi Anda harus menambahkan baris berikut ke profil ~ /. Anda sehingga barang yang dibagikan akan ditemukan saat Anda membutuhkannya:Catatan: Anda harus memulai shell baru atau menjalankannya di baris perintah agar perubahan diterapkan. Anda mungkin juga ingin menjalankan
hash -r
jika Anda baru saja menghapus skrip lama dari path.Kelola Jalur Python
Anda perlu memastikan bahwa paket yang Anda instal lebih tinggi dalam urutan pencarian Python daripada paket yang diinstal sistem. Cara termudah untuk melakukannya adalah dengan
.pth
file. Ini mengikuti saran @ Sacrilicious di tempat lain di halaman ini , tetapi memastikan bahwa direktori paket-situs pengguna Anda dicari sebelum direktori paket-situs-sistem Anda, dan keduanya dicari sebelum perpustakaan standar dan direktori Extras Apple (keduanya di bawah / System /. ..) Itu juga menghilangkan/System/.../Extras
dari jalur pencarian jika diinginkan.Buat file bernama
fix_mac_path.pth
, dengan teks di bawah ini. Jika Anda menginstal paket untuk semua pengguna,fix_mac_path.pth
harus ditempatkan di/Library/Python/2.7/site-packages
. Jika Anda menginstal hanya untuk pengguna Anda sendiri,fix_mac_path.pth
harus dalam ~ / Library / Python / 2.7 / lib / python / paket-situs. (File ini dapat memiliki nama apa pun yang Anda inginkan, tetapi harus ditempatkan di salah satu atau kedua lokasi ini, dan harus diakhiri dengan.pth
; juga, semua teks dalam file ini harus dalam satu baris.)Jika Anda ingin menyembunyikan paket yang diinstal Apple di
/System/.../Extras
:Pertama jalankan salah satu dari perintah berikut untuk mendapatkan salinan pip / setuptools yang berfungsi independen dari versi yang disediakan Apple:
Kemudian masukkan kode berikut di
fix_mac_path.pth
lokasi yang ditentukan di atas:Jika Anda ingin terus menggunakan paket yang diinstal oleh Apple, Anda tidak perlu menginstal salinan setuptools lainnya. Masukkan kode berikut di
fix_mac_path.pth
lokasi yang ditentukan di atas:Setelah ini, Anda dapat menggunakan
python -m site
untuk memastikan urutan pencarian jalur masuk akal.Instal Paket
Setelah ini, Anda harus dapat menginstal paket baru menggunakan salah satu dari perintah berikut.
Untuk semua pengguna:
Untuk pengguna Anda sendiri:
sumber
Pertama, Anda tidak menonaktifkan SIP sebagai cara untuk mengatasi masalah ini. Maaf itulah alasan pembuatan folder ini gagal, tetapi kami harus mengatasinya. Kedua, Anda kehilangan semua kebaikan yang Apple pikir mereka berikan kepada Anda, seperti jembatan melalui pyObjC, ketika Anda menginstal Python Anda sendiri.
(Saya akui, mereka mengatakan Anda harus menginstal sendiri
/usr/local
jika Anda seorang pengembang, saya hanya keberatan melakukannya dengan cara yang mudah dengan minuman.)Secara logis, Anda akan berpikir untuk menginstalnya di suatu tempat SIP tidak menghalangi Anda, dan ini hampir pasti beberapa ketergantungan pipa diselesaikan untuk Anda. Memberitahu pip di mana Anda ingin melakukan instalasi bukan obat sebanyak mengabaikannya pada / Sistem yang sudah ada, yang mana ia akan memeriksa dependensi untuk banyak instalasi umum yang perlu, misalnya
six
, dan SIP menyebabkan pip untuk memecahkan sendiri ketika pergi untuk mencoba dan memutakhirkannya. Sebenarnya perilaku default pip untuk menginstal ke /Library/Python/2.7/site-packages, Anda hanya perlu mengatakan--ignore-installed
untuk memaksanya untuk menginstal versi dependensi yang diperbarui di sana.... Sayangnya, Anda kemudian dapat mengimpor modul ini dalam sesi atau skrip interaktif dan mendapatkan kegagalan yang bagus - masih melihat paket / sistem yang tidak di-upgrade!
Sejak awal setuptools hari, Python memiliki cara untuk membuat pencarian itu eksplisit. Agak aneh, (dan harus membuat jeda bagi kita yang sadar keamanan dan tidak senang tentang keterusterangan mendorongnya ke atas daftar tanpa memeriksa, tetapi) Anda dapat menempatkan file yang diakhiri dengan
.pth
( misalnya 'elcap.pth')/Library/Python/2.7/site-packages
untuk mendorong direktori itu ke depan urutan pencarian dengan konten berikut:import sys; sys.path = ['/Library/Python/2.7/site-packages'] + sys.path
Mulai sesi baru, dan perjalanan cepat untuk
python -m site
mengonfirmasi bahwa Anda telah memasukkan jalur itu ke dalam slot pertama, dan mengimpor modul akan berfungsi.Oh, dan setelah semua ini, coba hanya menginstal dengan
--user
opsi pip , atau menggunakan virtualenv - itu praktik terbaik bagi kebanyakan orang.sumber
--user
atau menggunakan virtualenv. Saya hanya berpikir, sebagai sysadmin, yang Anda instal satu kali untuk suatu sistem, dan bahwa pengguna harus dapat mengesampingkan sistem. Keberatan terhadap solusi ini mungkin karena sistem akan melihat jalur yang diubah, tetapi ada contoh bahwa easy_install dapat menulis file .pth juga.sudo pip install --ignore-installed ipython
dan itu berjalan sampai "Menjalankan setup.py instal untuk pexpect", di mana pip masih mencoba untuk meningkatkan sesuatu di / System / Perpustakaan / Windows / Windows.framework/Versions/2.7/share , dan kesalahan keluar.pip --user
dan virtualenv masih tidak berfungsi.Saya pikir ini karena SIP atau System Integrity Protection , semacam perlindungan file waktu-nyata yang terasa seperti anti-virus windows :) dan menghentikan segala perubahan yang ingin Anda lakukan di folder sistem OS X. Apple hanya memutuskan untuk menonaktifkan modifikasi sistem - untuk memastikan Anda sepenuhnya dilindungi dari kejahatan internet dan kekuatan jahat terkait komputer lainnya yang SIP lindungi kami dari.
Jika Anda ingin menonaktifkan SIP Anda harus boot ke Recovery HD dengan menahan tombol Command + R secara bersamaan saat Anda mem-boot Mac Anda.
Buka terminal dari menu Utilities, dan ketik
csrutil disable
, lalu tekan kembali. Buka Menu Apple untuk mem-boot ulang.SIP akan dinonaktifkan mulai sekarang. Saya menonaktifkannya sejak lama dan belum melihat ada yang salah, beberapa proses tampaknya mengeluh tetapi mereka selalu melakukannya pada OS X jadi saya tidak yakin apakah itu disebabkan oleh kurangnya 'perlindungan' Integritas Sistem.
Tip saya adalah untuk sepenuhnya menghilangkan SIP dan / atau menggunakan homebrew untuk semua perangkat lunak opensource / pengembangan Anda. Homebrew menggunakan direktori / usr / local untuk cicilannya dan tidak bertabrakan dengan komponen sistem lainnya, dan homebrew build lebih mutakhir daripada os x apple build.
sumber
/System
; terlarang pada 10.11. Kita dapat menggunakan csrutil untuk menonaktifkan sementara jika kita dalam keadaan darurat, meskipun saya tahu itu mungkin terasa seperti bisa berubah menjadi pukulan keras, tetapi ini sepertinya bukan alasan yang baik untuk menggunakannya. Meninggalkannya adalah ... mengapa kita tidak bisa memiliki hal-hal baik.statusSystem Integrity Protection status: enabled (Custom Configuration). Configuration: Apple Internal: disabled Kext Signing: disabled Filesystem Protections: disabled Debugging Restrictions: disabled DTrace Restrictions: disabled NVRAM Protections: disabled
dan tidak memiliki alasan untuk mengaktifkannya karena saya mendapatkan sistem saya cukup tertutup dan dikustomisasiDigunakan
pip3 install <package>
sebagai gantinya dan memecahkan masalah izin dipip
.sumber
Percayalah, Anda tidak benar-benar ingin perpustakaan menulis apa pun di jalur itu.
Sebelumnya tidak direkomendasikan, tetapi mungkin untuk menulis
/System/Library/Frameworks/Python.framework/Versions/2.7/
, tetapi sekarang tidak didukung karena Apple SIP dan jadi itu masalah pemilik perpustakaan. Distribusi paket harus ditingkatkan agar berfungsi dengan benar dengan pembaruan ini. Sebagian besar paket diperbarui dan instal kontennya/Library/Python/2.7/site-packages
, tetapi beberapa paket tidak diperbarui.Untuk kasus saya, itu adalah perpustakaan greenlet yang mencoba menulis
.h
file -nya ke folder System Frameworks:Cara memperbaikinya:
sudo -H pip install greenlet --install-option "--install-headers=/Library/Python/2.7/lib/python/includes/"
lalusudo -H pip install gevent
Untuk numpy, perbaikannya adalah
sudo -H pip install --ignore-installed -U numpy
.Untuk perpustakaan lain, perbaikan bervariasi dari https://github.com/pypa/pip/issues/3177 ke
pip install --ignore-installed six
danpip install --user
(yang terakhir menginstal semuanya ke /User//Library/Python/2.7/ path). Lihat juga jawaban teratas saat ini untuk posting ini: https://apple.stackexchange.com/a/210021/169157Jika Anda mengetiknya
python -m site
harus menyertakansys.path = [ ... '/Library/Python/2.7/site-packages', ... ]
sebelum jalur sistem - itu sebabnya (dan bagaimana) itu bekerja.sumber
Saya melakukannya sebagai berikut:
kemudian setelah python diinstal:
sumber
brew install python
sudah menginstal pip dengannya. Jika Anda menginstal pip melalui easy_install, Anda mungkin berakhir dengan dua instalasi pip yang dapat menyebabkan masalah membingungkan.Solusi yang sangat keren untuk masalah ini adalah menggunakan virtualenv (virtualenvwrapper), setelah Anda membuat lingkungan baru untuk proyek Anda, Anda dapat menggunakan pip tanpa masalah, jadi saya menggunakan virtualenvwrapper dan dua baris ini memperbaiki masalah:
sumber
pip install virtualenv
atau apakah pip tidak berfungsi dan Anda harus menggunakansudo easy_install
+1 untuk apa yang sudah ada di sini. Cheerssudo easy_install
berfungsiSaya telah menginstal python3 di mac saya sementara python2.7 asli dilengkapi dengan OSX. Jadi setiap kali saya ingin memanggil python3, saya cukup ketik $ python3 .... Mungkin Anda harus mencoba $ python3 get-pip.py, ini berfungsi untuk saya ketika saya memiliki masalah yang hampir sama dengan Anda.
sumber
Ringkasan
Saya menekan masalah ini pada Mac OS X 10.11.6 (yang memiliki SIP) karena saya menginstal pip menggunakan System easy_install, dan local-install.pth mudah disebut pustaka sistem.
Ketika menginstal paket berikutnya dengan pip beberapa dependensi diselesaikan ke pustaka System Python yang lebih lama.
Solusinya adalah menghapus pustaka yang diinstal secara lokal dan menginstal ulang versi python lokal (yang mencakup pip) dari https://www.python.org/downloads/ sehingga sistem dan instance python yang diinstal secara lokal disimpan terpisah.
Saya telah mencoba menggunakan perbaikan fix_mac_path.pth dalam jawaban oleh @mfripp namun saya menemukan menghapus dan menginstal ulang pembersih.
Sebab
(Jangan ikuti langkah-langkah ini)
Saya mengalami masalah ini ketika mencoba menginstal Ansible. Saya mengikuti Ansible docs untuk instalasi pada OS X via pip.
Pertama saya instal pip dengan
sudo easy_install pip
Ini menggunakan System easy_install at
/usr/bin/easy_install
dan install pip at./Library/Python/2.7/site-packages/pip
Saya mendapat peringatan sebagai berikut ketika menginstal pip tetapi saya mengabaikannya dan membajak secara membabi buta.
Kemudian melihat
/Library/Python/2.7/site-packages/easy-install.pth
, itu tampak seperti iniKemudian saya menginstal ansible melalui pip
Saya mendapat pesan untuk mengatakan bahwa persyaratan sudah dipenuhi oleh perpustakaan sistem
Kemudian ketika menjalankan ansible saya mendapat masalah ini
dan pemeriksaan pip mengungkapkan paramiko membutuhkan setuptools yang lebih baru
Perhatikan bahwa hanya setuptools yang diperlukan (tidak ada versi) dan karenanya pip melaporkan ketergantungan yang dipenuhi oleh System setuptools.
Larutan
Saya mengatasinya dengan menghapus instalan pustaka python lokal menggunakan proses yang diisyaratkan di https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython
Bagi saya ini melibatkan
Kemudian saya menghapus symlink dan executable di / usr / local / bin seperti
dan seterusnya. Saya juga menghapus aplikasi apa pun
Saya kemudian mengunduh paket pemasang 2.7.13 untuk Mac OS X dari https://www.python.org/downloads/ dan menginstalnya.
Ini menginstal python lokal dan pip at
/Library/Frameworks/Python.framework/Versions/2.7
dan symlink di/usr/local/bin
mana terpisah dari pustaka sistem di/System/Library/Frameworks/Python.framework
dan/usr/bin
sehingga saya dapatkandan masuk
pip list
ansible sekarang bekerja untuk saya
sumber
Bagi saya,
PATH
hilang untukpip
, ini dikonfirmasi dengan menjalankanpython -m pip
Dua solusi potensial di sini, tambahkan
pip
kembali kePATH
. Dalam kasus sayapip
sudah ketinggalan zaman, jadi upgrade memperbaikinya:python -m pip install --upgrade pip
✗ pip --version pip 9.0.1 from /Library/Python/2.7/site-packages (python 2.7)
sumber