Masalah ini sering muncul ketika pip mencoba menginstal halaman manual untuk IPython pada El Capitan. Perbaikan cepat adalah dengan menggunakan perintah pip seperti ini:
sudo -H pip install --install-option '--install-data=/usr/local' <package>
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 juga OSError: [Errno: 1]
, tetapi datang setelah pesan seperti Uninstalling 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.
- Apakah Anda ingin terus menggunakan Python versi Mac OS X atau menginstalnya sendiri? Memasang sendiri adalah pilihan paling aman, dan dapat dilakukan melalui penginstal Python resmi, Homebrew atau Anaconda. Ini juga yang direkomendasikan Apple , seperti yang ditunjukkan oleh @Sacrilicious . Jika Anda menginstal versi Python Anda sendiri, Anda mungkin harus menghapus instalan apa pun yang saat ini diinstal
/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 menjalankan pip 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 :
sudo -H easy_install pip
# pip script will be installed in /usr/local/bin
Atau gunakan perintah ini untuk menginstal pip hanya untuk akun pengguna Anda sendiri :
easy_install --user pip
# pip script will be installed in ~/Library/Python/2.7/bin
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 ):
[install]
install-data=/usr/local
install-headers=/usr/local
Jika Anda biasanya menggunakan sudo -H pip ...
, maka Anda harus meletakkan file ini di /var/root
(direktori home untuk pengguna root). Jika Anda biasanya menggunakan sudo 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:
export PATH=~/Library/Python/2.7/bin:$PATH
export MANPATH=~/Library/Python/2.7/share/man:$MANPATH
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:
pip install --ignore-installed --user setuptools # your account only
# or
sudo -H pip install --ignore-installed setuptools # all users
Kemudian masukkan kode berikut di fix_mac_path.pth
lokasi yang ditentukan di atas:
import sys; std_paths=[p for p in sys.path if p.startswith('/System/') and not '/Extras/' in p]; sys.path=[p for p in sys.path if not p.startswith('/System/')]+std_paths
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:
import sys; std_paths=[p for p in sys.path if p.startswith('/System/')]; sys.path=[p for p in sys.path if not p.startswith('/System/')]+std_paths
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:
sudo -H pip install <package>
Untuk pengguna Anda sendiri:
pip install --user <package>