Bagaimana cara menggunakan pip setelah peningkatan OS X El Capitan?

116

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?

web_ninja
sumber
1
Di mana pip pada sistem Anda?
user151019
$ di mana pip / usr / local / bin / pip
web_ninja
$ pip --version pip 7.1.2 dari /Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg (python 2.7)
web_ninja
Bagaimana Anda menginstal pip - itu harus menulis ke /Library/Python/2.7/site-packages not / System
user151019
Saya tidak ingat sekarang. Saya pikir setelah memposting komentar yang merupakan masalah dan menggunakan minuman untuk menginstal python dan yang memperbaiki lokasi pip.
web_ninja

Jawaban:

84

Sebuah solusi cepat adalah dengan menggunakan homebrew untuk menginstal pythonke dalam /usr/local/binsehingga Anda pipdapat dijalankan terhadap kerangka python dimodifikasi-friendly.

brew install python
pip --version

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.

ls -lO /System/Library/Frameworks/Python.framework/Versions/2.7/
csrutil status

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.

bmike
sumber
1
Pembuatan python yang diseduh tidak stabil dan macet secara acak
jayatubi
@jayatubi Paket atau skrip apa yang tidak stabil untuk Anda? Apakah Anda menginstal python 2.7.10 dari minuman atau python3 yang baru saja mengalami benjolan besar dan diketahui tidak kompatibel dengan versi sebelumnya. Anda dapat memilih dari lusinan versi jika Anda lebih suka yang kurang lebih stabil untuk kebutuhan Anda.
bmike
1
Setuju itu brew install pythonadalah 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/bindan ~/Library/Caches/pip)
RichVel
Mengunduh python terkompilasi .pkg dari eg python.org/downloads/release/python-2712 berfungsi dengan baik untuk saya, pada 10.8. Adakah komentar tentang hal itu vs. homebrew? Terima kasih
denis
@denis, saya suka brewkarena 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.
bmike
77

Opsi lain yang layak tanpa harus menonaktifkan SIP atau menginstal versi Python lainnya, adalah menginstal modul hanya untuk pengguna saat ini menggunakan

pip install --user <modulename>

Jika ini hanya mesin pribadi Anda, ini akan menjadi solusi paling sederhana dan teraman.

Michal Příhoda
sumber
1
Mungkin El Capitan menyediakan / usr / bin / pip, tetapi macOS Sierra tidak.
sigjuice
1
Bekerja pada sierra
harryparkdotio
57

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:

  1. 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'

  2. 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 pipakan 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 .

  3. 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.

  1. 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-packagesdan semua skrip yang diinstal /usr/local/binuntuk 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:

  1. 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 -Suntuk 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-packagesdan skrip terkait /usr/local/bin.

  2. 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.pygagal 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 -rjika 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 .pthfile. 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/.../Extrasdari 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.pthlokasi 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.pthlokasi 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 siteuntuk 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>
Matthias Fripp
sumber
Petunjuk yang sangat jelas dengan alternatif dijabarkan. Saya mengikuti panduan ini dan berhasil mengatasi masalah perpustakaan "enam", yang memungkinkan saya menginstal mitmproxy.
Paul Chernoch
1
Ini benar-benar salah satu jawaban paling informatif, lengkap, dan bermanfaat yang pernah saya temui di stackoverflow. Bagus, dan terima kasih.
cmsjr
@ cmsjr, terima kasih! Butuh beberapa saat untuk mencari tahu apa yang sedang terjadi, dan ini memberi saya tempat yang baik untuk merujuk kembali ke sana!
Matthias Fripp
4
Sejauh ini penjelasan paling jelas dan terlengkap yang pernah saya lihat di area ini, terutama pembersihan sistem yang ada kekacauan Python - terima kasih! Peningkatan utama saya akan lebih kuat merekomendasikan menggunakan Python buatan, karena ini sangat mudah dan menyediakan pengaturan yang bersih yang tidak memerlukan sudo. Ini di samping virtualenvs untuk proyek pengembangan.
RichVel
Benar-benar bencana. Tuhan memberkati Anda.
Matt M.
31

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/localjika 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-installeduntuk 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-packagesuntuk 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 sitemengonfirmasi bahwa Anda telah memasukkan jalur itu ke dalam slot pertama, dan mengimpor modul akan berfungsi.

Oh, dan setelah semua ini, coba hanya menginstal dengan --useropsi pip , atau menggunakan virtualenv - itu praktik terbaik bagi kebanyakan orang.

Pengorbanan
sumber
1
Sekarang ini elegan dan tandingan yang bagus untuk solusi "tinggalkan sistem Python dan diseduh" saya yang sederhana. Jika Anda perlu cepat dan kotor, ini mungkin tidak sepadan dengan usaha, tetapi menjaga pyObjC dan satu python memiliki manfaat besar.
bmike
2
Lebih pythonic dan masuk akal akan menginstal sebagai --useratau 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.
Sacrilicious
2
Saya tidak tahu apakah cara pembuatan bir adalah cara yang mudah / salah - ini adalah masalah penyelesaian masalah, dan minuman ini menyelesaikan masalah saya dengan luar biasa - berpikir sendiri tentang berapa banyak upaya yang diperlukan untuk bermain dengan mainan baru (ruby 2.2 .3, python3.5, MongoDB, Node4.2.1) dengan cara yang nyaman, seperti mengetik perintah dan mengkompilasi ulang, memperbarui dan mengeluarkan thrash - well, jadi saya mengambil jalan yang mudah :) :) Saya tidak tahu apa yang versi OS X Python yang dikirimkan sangat berbeda di samping dukungan Cocoa and Threads dan banyak paket yang tidak pernah saya gunakan sebelumnya dan saya memang menyusun tumpukan barang
PJJ
Saya menambahkan elcap.pth ke /Library/Python/2.7/site-packages, sekarang saya melihat path yang terdaftar di indeks 0 dan 2 dari sys.path. Kemudian saya mencoba sudo pip install --ignore-installed ipythondan 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.
kojiro
Instalasi virtualenv memerlukan penggunaan pip, sehingga tidak benar-benar menyelesaikan masalah yang terkait dengan penggunaan pip. Seperti itu, saya menginstalnya dengan pip --userdan virtualenv masih tidak berfungsi.
user5359531
4

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.

PJJ
sumber
1
Tidak masuk akal untuk memilih jawaban ini. Tapi, mungkin seseorang hanya uring-uringan? +1 dari saya ...
bmike
1
Terima kasih sobat! Mencoba untuk menaruh humor, tetapi tidak semua orang harus selaras dengan pemahaman saya tentang hal itu;)
PJJ
Hmm - setelah membaca jawaban yang mengharamkan , saya tidak begitu yakin ini SIP. Pikiran?
bmike
1
Ini memang SIP mencegah pembuatan folder (mungkin untuk sesuatu seperti halaman manual) sebagai subdirektori dari /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.
Sacrilicious
Saya mendapatkannya sepanjang waktu: 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 dikustomisasi
PJJ
4

Digunakan pip3 install <package>sebagai gantinya dan memecahkan masalah izin di pip.

Keng
sumber
4

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 .hfile -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 sixdan pip 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/169157

Jika Anda mengetiknya python -m siteharus menyertakan sys.path = [ ... '/Library/Python/2.7/site-packages', ... ] sebelum jalur sistem - itu sebabnya (dan bagaimana) itu bekerja.

Yuri Baburov
sumber
3

Saya melakukannya sebagai berikut:

brew install python

kemudian setelah python diinstal:

sudo easy_install pip
ramuan gerak
sumber
3
brew install pythonsudah menginstal pip dengannya. Jika Anda menginstal pip melalui easy_install, Anda mungkin berakhir dengan dua instalasi pip yang dapat menyebabkan masalah membingungkan.
NSSynapse
3

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:

mkproject <project_name>
pip install <package_name>
neosergio
sumber
Bagaimana Anda merekomendasikan menginstal virtualenv? pip install virtualenvatau apakah pip tidak berfungsi dan Anda harus menggunakan sudo easy_install+1 untuk apa yang sudah ada di sini. Cheers
bmike
1
pip tidak berfungsi karena masalah izin, jadi sudo easy_installberfungsi
neosergio
2

Saya 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.

dynamitez
sumber
2

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_installdan 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.

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'python_requires'
  warnings.warn(msg)
warning: no previously-included files found matching '.coveragerc'
...
Adding pip 9.0.1 to easy-install.pth file
Installing pip script to /usr/local/bin
...
Installed /Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg
...
Finished processing dependencies for pip

Kemudian melihat /Library/Python/2.7/site-packages/easy-install.pth, itu tampak seperti ini

import sys; sys.__plen = len(sys.path)
./pip-9.0.1-py2.7.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)

Kemudian saya menginstal ansible melalui pip

sudo pip install ansible

Saya mendapat pesan untuk mengatakan bahwa persyaratan sudah dipenuhi oleh perpustakaan sistem

Requirement already satisfied: setuptools in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from ansible)  
Requirement already satisfied: six>=1.4.1 in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from cryptography>=1.1->paramiko->ansible)

Kemudian ketika menjalankan ansible saya mendapat masalah ini

VersionConflict: (setuptools 1.1.6 (/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python), Requirement.parse('setuptools>=11.3'))

dan pemeriksaan pip mengungkapkan paramiko membutuhkan setuptools yang lebih baru

pip check paramiko
matplotlib 1.3.1 requires tornado, which is not installed.
matplotlib 1.3.1 requires nose, which is not installed.
cryptography 1.7.2 has requirement setuptools>=11.3, but you have setuptools 1.1.6.

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

sudo rm -rf /Library/Python

Kemudian saya menghapus symlink dan executable di / usr / local / bin seperti

sudo rm /usr/local/bin/ansible  # executable
sudo rm /usr/local/bin/python*  # symlinks to /Library/Python/2.7
sudo rm /usr/local/bin/easy_install*

dan seterusnya. Saya juga menghapus aplikasi apa pun

sudo rm -rf /Applications/Python\ 2.7/

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.7dan symlink di /usr/local/binmana terpisah dari pustaka sistem di /System/Library/Frameworks/Python.frameworkdan /usr/bin sehingga saya dapatkan

which pip
/Library/Frameworks/Python.framework/Versions/2.7/bin/pip
which ansible
/Library/Frameworks/Python.framework/Versions/2.7/bin/ansible

dan masuk pip list

setuptools (28.8.0)
six (1.10.0)

ansible sekarang bekerja untuk saya

Jason S
sumber
1

Bagi saya, PATHhilang untuk pip, ini dikonfirmasi dengan menjalankanpython -m pip

Dua solusi potensial di sini, tambahkan pipkembali ke PATH. Dalam kasus saya pipsudah 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)

Vinnie James
sumber