วิธีใช้ pip หลังจากอัพเกรด OS X El Capitan


116

หลังจากอัพเดต El Capitan ฉันไม่สามารถเรียกใช้การติดตั้ง pip ได้ ข้อผิดพลาดที่ฉันได้รับคือ "การดำเนินการไม่ได้รับอนุญาต" เมื่อ pip พยายามสร้างโฟลเดอร์ใหม่ขณะติดตั้ง

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

ที่จริงแล้วโดยทั่วไปฉันไม่สามารถสร้างโฟลเดอร์ ฯลฯ ในโฟลเดอร์เหล่านี้ได้ ลองใช้ sudo ที่ไม่ช่วย นอกจากนี้ฉันได้ทำ

sudo chflags nouchg /System/Library/Frameworks/Python.framework/Versions/2.7/

ข้างต้นไม่ได้ช่วยอย่างใดอย่างหนึ่ง ฉันจะทำอย่างไรเพื่อให้สามารถติดตั้งห้องสมุดหลามได้อย่างราบรื่นอีกครั้ง


1
pip ในระบบของคุณอยู่ที่ไหน
user151019

$ โดยใช้ pip / usr / local / bin / pip
web_ninja

$ pip --version pip 7.1.2 จาก /Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg (python 2.7)
web_ninja

คุณติดตั้ง pip ได้อย่างไร - ควรเขียนถึง /Library/Python/2.7/site-packages not / System
user151019

ฉันจำไม่ได้แล้ว ฉันคิดว่าหลังจากโพสต์ความคิดเห็นที่เป็นปัญหาและใช้ Brew เพื่อติดตั้ง python และแก้ไขตำแหน่งของ pip
web_ninja

คำตอบ:


84

วิธีการแก้ปัญหาอย่างรวดเร็วคือการใช้Homebrewที่จะติดตั้งpythonลงไป/usr/local/binเพื่อให้คุณpipสามารถทำงานกับกรอบหลามใช้สามารถปรับเปลี่ยนได้

brew install python
pip --version

การปิดใช้งานการป้องกันความสมบูรณ์ของระบบก็เป็นตัวเลือกเช่นกัน แต่ฉันไม่แนะนำให้ทำเช่นนั้นยกเว้นเซิร์ฟเวอร์ที่มีการจัดการอย่างมืออาชีพและติดตั้งกำแพงไฟซึ่งคุณมีกำลังคนในการจัดการการตรวจจับการบุกรุกหรือหากคุณเป็นนักพัฒนา / ดูแลระบบ จิบ.

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

คุณจะเห็นว่ามีการตั้งค่าสถานะจำกัดซึ่งไม่สามารถลบได้แม้ในขณะที่รูทในขณะที่ SIP กำลังทำงานอยู่

การใช้ homebrew ทำให้สามารถจัดการ pip และ python แยกต่างหากจากระบบที่มีให้ เป็นโบนัสเฟรมเวิร์กของ homebrew ได้รับการออกแบบมาเพื่อให้ง่ายต่อการบำรุงรักษาและแก้ไข / การทำงานบ้านผ่านระบบอัตโนมัติ


1
ไพ ธ อนที่ติดตั้ง Brew ไม่เสถียรและเกิดข้อผิดพลาดแบบสุ่ม
jayatubi

@jayatubi แพคเกจหรือสคริปต์ใดที่ไม่เสถียรสำหรับคุณ คุณกำลังติดตั้ง python 2.7.10 จาก brew หรือ python3 ที่เพิ่งได้รับการชนที่สำคัญและเป็นที่รู้จักกันว่าไม่เข้ากันได้ย้อนหลัง คุณสามารถเลือกรุ่นได้หลายสิบรุ่นหากคุณต้องการรุ่นที่เสถียรมากกว่าหรือน้อยกว่าสำหรับความต้องการของคุณ
bmike

1
ยอมรับว่าbrew install pythonเป็นตัวเลือกที่ง่ายที่สุด แต่การทำความสะอาดการตั้งค่าอื่น ๆ อาจจำเป็นถ้าคุณใช้ Python ของระบบมาระยะหนึ่ง (เช่นไฟล์ Python ที่เป็นเจ้าของรูทภายใต้/usr/local/binและ~/Library/Caches/pip)
RichVel

การดาวน์โหลด python .pkg ที่คอมไพล์แล้วจากเช่นpython.org/downloads/release/python-2712 นั้นใช้ได้ผลดีสำหรับฉันใน 10.8 ความคิดเห็นใด ๆ เกี่ยวกับสิ่งนั้นกับ homebrew? ขอบคุณ
denis

@denis ฉันชอบbrewเพราะมันง่ายที่จะตรึงเวอร์ชันที่คุณชอบ - จัดการหลาย ๆ เวอร์ชันที่แตกต่างกันหรืออัปเดตสิ่งต่าง ๆ เป็นประจำ หากคุณมีบางอย่างที่เหมาะกับคุณ - ยากที่จะโต้แย้งว่าคุณควรเปลี่ยนแปลงอะไร
bmike

77

อีกตัวเลือกที่ทำงานได้โดยไม่จำเป็นต้องปิดการใช้งาน SIP หรือติดตั้ง Python เวอร์ชันอื่น ๆ คือการติดตั้งโมดูลสำหรับผู้ใช้ปัจจุบันเท่านั้น

pip install --user <modulename>

หากเป็นเพียงเครื่องส่วนตัวของคุณนี่จะเป็นวิธีที่ง่ายและปลอดภัยที่สุด


1
อาจเป็น El Capitan ที่ให้ / usr / bin / pip แต่ macOS Sierra ไม่ได้
sigjuice

1
ใช้งานได้กับเซียร์รา
harryparkdotio

57

ปัญหานี้มักเกิดขึ้นเมื่อ pip พยายามติดตั้ง manpage สำหรับ IPython ใน El Capitan การแก้ไขด่วนคือการใช้คำสั่ง pip เช่นนี้:

sudo -H pip install --install-option '--install-data=/usr/local' <package>

อย่างไรก็ตาม System Integrity Protection (SIP) บน El Capitan บล็อกการปฏิบัติที่ไม่ดีหลายอย่างด้วย pip ที่ใช้ในการเลื่อนดูดังนั้นคุณอาจจำเป็นต้องทำการเปลี่ยนแปลงเพิ่มเติมเพื่อให้ pip ทำงานได้อย่างราบรื่นบน El Capitan

SIP บน El Capitan แสดงถึงปัญหาสามประการด้วยการใช้ pip กับ Python เวอร์ชันที่ Apple จัดหาให้ใน OS X:

  1. distutils ไม่ได้กำหนดสองตัวแปรสำคัญอย่างถูกต้องใน Macs, พยายาม pip เพื่อที่จะเขียนส่วนหัวและไฟล์ที่ใช้ร่วมกันอื่น ๆ (เช่น manpages) /System/Library/Frameworks/Python.framework/Versions/2.7/ภายใต้ นี่เป็นความคิดที่ไม่ดี แต่ใน OS X เวอร์ชั่นก่อนหน้ามันประสบความสำเร็จถ้า pip ถูกเรียกใช้ด้วย sudo อย่างไรก็ตามมันล้มเหลวใน El Capitan เนื่องจาก SIP นี่เป็นข้อผิดพลาดที่คุณพบ มันให้ข้อความเช่นOSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'

  2. Apple ติดตั้งแพคเกจบางรุ่นที่ล้าสมัยใน/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/(เช่นหก) ในรุ่นก่อนหน้าของ OS X เมื่อคุณติดตั้งแพคเกจที่จำเป็นต้องมีรุ่นใหม่ของหนึ่งในเหล่านี้sudo pipอย่างเงียบ ๆ จะเอารุ่นเก่าจากโฟลเดอร์และติดตั้งในรุ่นที่ใหม่กว่า/System/ /Library/Python/2.7/site-packagesนี่เป็นความคิดที่ไม่ดีและไม่สามารถใช้ SIP ได้อีกต่อไป แต่ตอนนี้ pip จะล้มเหลวพร้อมกับข้อความแสดงข้อผิดพลาดขณะพยายามลบแพ็คเกจเก่า ข้อความนั้นก็เช่นOSError: [Errno: 1]กัน แต่มันเกิดขึ้นหลังจากข้อความดังUninstalling six-1.4.1:กล่าว ดูเช่นhttps://github.com/pypa/pip/issues/3165

  3. Python เวอร์ชันของ Apple เพิ่มหลายไดเรกทอรีภายใต้/System/Library/Frameworks/Python.framework/Versions/2.7/เส้นทางค้นหาของ Python เหนือตำแหน่งติดตั้งแพ็คเกจที่ผู้ใช้สามารถเข้าถึงได้มาตรฐาน ดังนั้นหากคุณติดตั้งเวอร์ชันใหม่ของแพคเกจอื่น ๆ (เช่นsudo -H pip install --ignore-installed six) คุณจะได้รับข้อความว่าการติดตั้งประสบความสำเร็จ /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/แต่แล้วเมื่อคุณเรียกหลามคุณจะได้รับรุ่นเก่าจาก สิ่งนี้ทำให้เป็นไปไม่ได้ที่จะใช้แพ็คเกจใหม่ที่มีชื่อเหมือนกับโมดูลจากไลบรารีมาตรฐาน

คุณสามารถแก้ไขปัญหาเหล่านี้ได้ แต่วิธีการนั้นขึ้นอยู่กับคำตอบของคุณสำหรับสามคำถาม

  1. คุณต้องการใช้ Python เวอร์ชัน Mac OS X ต่อไปหรือติดตั้งของคุณเองหรือ การติดตั้งของคุณเองเป็นตัวเลือกที่ปลอดภัยที่สุดและสามารถทำได้ผ่านตัวติดตั้ง Python อย่างเป็นทางการ Homebrew หรือ Anaconda และนี่ก็เป็นสิ่งที่แอปเปิ้ลแนะนำเป็นแหลมออกโดย @Sacrilicious หากคุณติดตั้ง Python เวอร์ชันของคุณเองคุณอาจจะถอนการติดตั้งสิ่งที่ติดตั้งไว้ในปัจจุบัน/Library/Python/2.7/site-packagesและสคริปต์ใด ๆ ที่ติดตั้งไว้/usr/local/binสำหรับแพ็คเกจเหล่านั้น (รวมถึง pip) มิฉะนั้นคุณจะมีประสบการณ์ที่น่ารำคาญของสคริปต์บางตัวที่เข้าถึง Python เวอร์ชันที่ติดตั้งระบบและบางตัวจะเข้าถึงการติดตั้งของคุณเอง

หากคุณต้องการติดตั้ง Python ที่ติดตั้งระบบคุณจะต้องทำการตัดสินใจอีกสองครั้ง:

  1. คุณต้องการติดตั้งแพ็กเกจสำหรับผู้ใช้ทั้งหมดหรือเพียงเพื่อตัวคุณเอง? การติดตั้งสำหรับผู้ใช้ทั้งหมดทำให้มั่นใจได้ว่าทุกโปรแกรมที่ใช้ Python (รวมถึงสคริปต์การดูแลระบบ) จะสามารถเข้าถึงแพ็คเกจทั้งหมดที่คุณติดตั้ง อย่างไรก็ตามมีโอกาสที่จะรบกวนการใช้ Python ของ El Capitan (ฉันหวังว่า Apple จะใช้python -Sเพื่อให้แน่ใจว่าพวกเขาได้รับแพ็คเกจที่คาดหวังเสมอ แต่ฉันไม่มีวิธีทดสอบสิ่งนี้) การติดตั้งสำหรับบัญชีผู้ใช้ของคุณเองเท่านั้น หมายเหตุ: หากคุณกำลังจะเปลี่ยนจากการติดตั้งทั้งระบบให้กับผู้ใช้อย่างเดียวคุณอาจจะใช้โอกาสนี้ในการถอนการติดตั้งสิ่งที่ติดตั้งอยู่ในปัจจุบันและสคริปต์ที่เกี่ยวข้องใน/Library/Python/2.7/site-packages/usr/local/bin

  2. คุณต้องการซ่อนแพ็กเกจพิเศษที่ติดตั้งกับ Python เวอร์ชั่น OS X (ใต้/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/) หรือเก็บไว้ในพา ธ การค้นหาหรือไม่ ฉันขอแนะนำให้ซ่อนพวกเขาเพื่อให้แพ็คเกจรุ่นใหม่ล่าสุดเหล่านี้จะถูกติดตั้งโดยอัตโนมัติในตำแหน่งที่ผู้ใช้เข้าถึงได้เมื่อจำเป็น หากคุณไม่ซ่อนไดเรกทอรีนี้ในบางครั้งคุณจะได้รับข้อความที่ pip ไม่สามารถลบแพ็คเกจที่มีอยู่เพื่ออัปเกรดเป็นเวอร์ชันใหม่กว่า (จำเป็นต้องใช้แพ็คเกจอื่นที่คุณกำลังติดตั้ง) ในกรณีนี้คุณจะต้องเรียกใช้pip install --ignore-installed <package>ซึ่งจะติดตั้งเวอร์ชันที่ใหม่กว่าและซ่อนรุ่นที่ติดตั้งระบบ อย่างไรก็ตามหากคุณซ่อนทั้งหมด/System/.../Extras/...ไดเรกทอรีคุณจะสูญเสียการเข้าถึงบางแพ็คเกจของ Apple ที่ไม่สามารถใช้งานผ่าน pip เช่น CoreGraphics และ bonjour (หากคุณต้องการสิ่งเหล่านี้คุณอาจสามารถเข้าถึงได้โดยเชื่อมโยงลิงก์เหล่านั้นลงในไดเรกทอรีแพ็คเกจไซต์ของคุณ)

ตอนนี้ที่นี่มีวิธีแก้ปัญหา สิ่งเหล่านี้จะเป็นแนวปฏิบัติที่ดีสำหรับ OS X ทุกรุ่นเพื่อหลีกเลี่ยงการแทนที่หรือลบแพ็กเกจ Python ที่ใช้โดยระบบปฏิบัติการโดยไม่ตั้งใจ อย่างไรก็ตามมีความจำเป็นหากคุณต้องการใช้แพ็คเกจที่ติดตั้งโดยผู้ใช้กับ Python เวอร์ชันที่ Apple จัดหาให้ใน OS X El Capitan (10.11)

ติดตั้ง pip

คุณอาจจะทำอย่างนี้แล้ว แต่ถ้าไม่คุณสามารถใช้คำสั่งต่อไปนี้เพื่อติดตั้ง pip สำหรับผู้ใช้ทั้งหมด :

sudo -H easy_install pip
# pip script will be installed in /usr/local/bin

หรือใช้คำสั่งนี้เพื่อติดตั้ง pip สำหรับบัญชีผู้ใช้ของคุณเองเท่านั้น :

easy_install --user pip
# pip script will be installed in ~/Library/Python/2.7/bin

จัดการตำแหน่งไฟล์ที่แชร์

หากคุณกำลังติดตั้งแพ็กเกจสำหรับผู้ใช้ทั้งหมดให้สร้างไฟล์ชื่อ. pydistutils.cfg ด้วยบรรทัดเหล่านี้ (จากhttps://github.com/pypa/pip/issues/426 ):

[install]
install-data=/usr/local
install-headers=/usr/local

หากคุณมักจะใช้sudo -H pip ...แล้วคุณควรใส่ไฟล์นี้ใน/var/root(โฮมไดเรกทอรีสำหรับผู้ใช้รูท) หากคุณมักจะใช้sudo pip ...แล้วคุณควรใส่ไฟล์นี้ในไดเรกทอรีบ้านของคุณเอง (~)

การตั้งค่าเหล่านี้จะป้องกันไม่ให้ pip พยายามเขียนรายการที่แบ่งปันเช่นส่วนหัวและ manpages ที่อยู่ด้าน/Library/Systemล่าง (คำสั่งที่ด้านบนของคำตอบนี้เป็นเวอร์ชั่นที่เร็วกว่าของสิ่งเดียวกัน) การตั้งค่าเหล่านี้จำเป็นเนื่องจากโค้ดเฉพาะของดาร์วินใน /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.pyการตั้งค่าตัวแปรเหล่านี้ไปยังตำแหน่งที่สามารถรูทได้ (แม้ว่าจะตั้งค่าตัวแปรอื่น ๆ อย่างถูกต้อง) มีข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้อยู่ที่https://github.com/pypa/pip/issues/3177

หากคุณติดตั้งแพคเกจสำหรับบัญชีผู้ใช้ของคุณเองเท่านั้น~/Library/Python/2.7/รายการที่ใช้ร่วมกันจะได้รับการติดตั้งโดยอัตโนมัติภายใต้ แต่คุณควรเพิ่มบรรทัดต่อไปนี้ใน ~ / .profile ของคุณดังนั้นรายการที่แชร์จะถูกพบเมื่อคุณต้องการ:

export PATH=~/Library/Python/2.7/bin:$PATH
export MANPATH=~/Library/Python/2.7/share/man:$MANPATH

หมายเหตุ: คุณจะต้องเริ่มเชลล์ใหม่หรือรันเหล่านี้ในบรรทัดคำสั่งเพื่อให้การเปลี่ยนแปลงมีผล คุณอาจต้องการเรียกใช้hash -rหากคุณเพิ่งลบสคริปต์เก่าออกจากเส้นทาง

จัดการ Python Path

คุณจะต้องตรวจสอบให้แน่ใจว่าแพ็คเกจที่คุณติดตั้งนั้นสูงกว่าในลำดับการค้นหาของ Python มากกว่าแพ็คเกจที่ติดตั้งระบบ วิธีที่ง่ายที่สุดในการทำเช่นนี้คือกับ.pthไฟล์ สิ่งนี้เป็นไปตามข้อเสนอแนะของ @ Sacrilicious ที่อื่นในหน้านี้แต่ให้แน่ใจว่าไดเรกทอรีของผู้ใช้แพคเกจเว็บไซต์ของคุณถูกค้นหาก่อนไดเรกทอรีไดเรกทอรีเว็บไซต์แพคเกจทั่วทั้งระบบของคุณและทั้งสองจะถูกค้นหาก่อนห้องสมุดมาตรฐานและไดเรกทอรี Extras ของ Apple .. ) นอกจากนี้ยังละเว้น/System/.../Extrasจากเส้นทางการค้นหาหากต้องการ

สร้างไฟล์ชื่อfix_mac_path.pthพร้อมข้อความด้านล่าง ถ้าคุณติดตั้งแพคเกจสำหรับผู้ใช้ทุกคน ควรจะอยู่ในfix_mac_path.pth หากคุณกำลังติดตั้งสำหรับผู้ใช้ของคุณเองควรอยู่ใน ~ / Library / Python / 2.7 / lib / python / site-packages (ไฟล์นี้สามารถมีชื่อใดก็ได้ที่คุณต้องการ แต่จะต้องอยู่ในสถานที่หนึ่งหรือทั้งสองแห่งนี้และจะต้องลงท้ายด้วย; นอกจากนี้ข้อความทั้งหมดในไฟล์นี้จะต้องอยู่ในบรรทัดเดียว)/Library/Python/2.7/site-packages fix_mac_path.pth.pth

หากคุณต้องการซ่อนแพ็คเกจที่ติดตั้ง Apple ใน/System/.../Extras:

ขั้นแรกให้รันหนึ่งในคำสั่งต่อไปนี้เพื่อรับสำเนาของ pip / setuptools ที่เป็นอิสระจากเวอร์ชันที่ Apple จัดหาให้:

pip install --ignore-installed --user setuptools   # your account only
# or
sudo -H pip install --ignore-installed setuptools  # all users

จากนั้นใส่รหัสต่อไปนี้ในfix_mac_path.pthตำแหน่งที่ระบุไว้ด้านบน:

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

หากคุณต้องการใช้แพ็คเกจที่ติดตั้งโดย Apple ต่อไปคุณไม่จำเป็นต้องติดตั้ง setuptools อีกชุด เพียงใส่รหัสต่อไปนี้ในfix_mac_path.pthตำแหน่งที่ระบุไว้ด้านบน:

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

หลังจากนี้คุณสามารถใช้python -m siteเพื่อให้แน่ใจว่าลำดับการค้นหาพา ธ สมเหตุสมผล

ติดตั้งแพคเกจ

หลังจากนี้คุณควรจะสามารถติดตั้งแพ็คเกจใหม่โดยใช้หนึ่งในคำสั่งต่อไปนี้

สำหรับผู้ใช้ทั้งหมด:

sudo -H pip install <package>

สำหรับผู้ใช้ของคุณเอง:

pip install --user <package>

ทิศทางที่ชัดเจนมากพร้อมตัวเลือกที่สะกดออกมา ฉันทำตามคำแนะนำนี้และประสบความสำเร็จในการผ่านปัญหาห้องสมุด "หก" ทำให้ฉันสามารถติดตั้ง mitmproxy ได้
Paul Chernoch

1
นี่เป็นหนึ่งในคำตอบที่ให้ข้อมูลครบถ้วนสมบูรณ์และเป็นประโยชน์จริง ๆ ที่ฉันเคยพบใน stackoverflow ทำได้ดีมากและขอบคุณ
cmsjr

@cmsjr ขอบคุณ! ฉันใช้เวลาสักครู่เพื่อค้นหาว่าเกิดอะไรขึ้นและนี่ทำให้ฉันเป็นสถานที่ที่ดีในการอ้างอิงกลับมา!
Matthias Fripp

4
ตามคำอธิบายที่ชัดเจนและครบถ้วนที่สุดเท่าที่ฉันเคยเห็นมาในพื้นที่นี้โดยเฉพาะอย่างยิ่งการทำความสะอาดระบบ Python ที่มีอยู่ - ขอบคุณ! การปรับปรุงหลักของฉันขอแนะนำอย่างยิ่งให้ใช้ Python ที่มีการติดตั้งแบบชงเนื่องจากเป็นเรื่องง่ายมากและให้การตั้งค่าที่ไม่ต้องใช้ sudo นี่คือนอกเหนือจาก virtualenvs สำหรับโครงการพัฒนา
RichVel

เป็นภัยพิบัติอะไร ขอให้พระเจ้าคุ้มครอง.
Matt M.

31

ก่อนอื่นคุณไม่ได้ปิดใช้งาน SIP เพื่อแก้ไขปัญหา ขออภัยที่สาเหตุการสร้างโฟลเดอร์นี้ล้มเหลว แต่เราต้องแก้ไข ประการที่สองคุณสูญเสียสิ่งมีชีวิตทั้งหมดที่ Apple คิดว่าพวกเขาให้คุณเหมือนสะพานผ่าน pyObjC เมื่อคุณติดตั้ง Python ของคุณเอง
(ฉันจะยอมรับพวกเขาบอกว่าคุณควรติดตั้งของคุณเอง/usr/localหากคุณเป็นนักพัฒนาฉันแค่คัดค้านที่จะทำวิธีที่ง่ายด้วยการชง)

คุณคิดว่าจะติดตั้งที่ใดที่หนึ่ง SIP ไม่ได้ปิดกั้นคุณและนี่ก็เป็นที่แน่นอนว่ามีบางจุดเล็ก ๆ ที่พึ่งพาได้แก้ไขให้คุณ การบอกจุดที่คุณต้องการให้ทำการติดตั้งนั้นไม่ใช่วิธีการรักษาเท่าที่มันไม่สนใจสิ่งที่มีอยู่แล้วใน / ระบบซึ่งเป็นที่ที่มันจะตรวจสอบการอ้างอิงสำหรับการติดตั้งทั่วไปที่จำเป็นเช่นsixและ SIP ทำให้ pip ที่จะทำลายตัวเองเมื่อมันไปลองและอัพเกรด อันที่จริงแล้วมันเป็นพฤติกรรมเริ่มต้นของ pip ที่จะติดตั้งไปยัง /Library/Python/2.7/site-packages คุณเพียงแค่ต้องบอก--ignore-installedให้บังคับให้ติดตั้งการพึ่งพาเวอร์ชันที่อัพเดตใด ๆ
... แต่น่าเสียดายที่คุณอาจจะนำเข้าโมดูลนี้ในเซสชั่นหรือสคริปต์แบบโต้ตอบและได้รับความล้มเหลวไขมันที่ดี - มันยังคงดู / แพคเกจยกเลิกการอัพเกรดระบบ!

ตั้งแต่วันที่กำหนดไว้ก่อนหน้านี้ Python มีวิธีทำให้การค้นหานั้นชัดเจน มันดูค่อนข้างแปลก (และควรจะหยุดให้พวกเราที่ใส่ใจเรื่องความปลอดภัยและไม่ตื่นเต้นกับความทื่อของการผลักมันไปด้านบนของรายการโดยไม่ตรวจสอบ แต่) คุณสามารถวางไฟล์ที่ลงท้ายด้วย.pth( เช่น 'elcap.pth') ใน/Library/Python/2.7/site-packagesการผลักดันไดเรกทอรีนั้นไปยังด้านหน้าของลำดับการค้นหาที่มีเนื้อหาดังต่อไปนี้:
import sys; sys.path = ['/Library/Python/2.7/site-packages'] + sys.path

เริ่มเซสชันใหม่และการเดินทางที่รวดเร็วเพื่อpython -m siteยืนยันว่าคุณได้แทรกเส้นทางนั้นลงในช่องแรกแล้วและการนำเข้าโมดูลควรใช้งานได้

โอ้และหลังจากทั้งหมดนี้ลองติดตั้งด้วย--userตัวเลือกpip หรือใช้virtualenvซึ่งเป็นวิธีปฏิบัติที่ดีที่สุดสำหรับคนส่วนใหญ่


1
ตอนนี้มันสวยงามและเป็นจุดที่ดีในการแก้ปัญหา "ทิ้งระบบ Python และก่อให้เกิดมัน" หากคุณต้องการความรวดเร็วและสกปรกสิ่งนี้อาจไม่คุ้มค่ากับความพยายาม แต่การรักษา pyObjC และงูใหญ่ตัวหนึ่งมีข้อดีอย่างมาก
bmike

2
pythonic เพิ่มเติมและสมเหตุสมผลจะติดตั้งเป็น--userหรือใช้ virtualenv ฉันแค่คิดถึงในฐานะผู้ดูแลระบบที่คุณติดตั้งหนึ่งครั้งสำหรับระบบและผู้ใช้ควรจะสามารถแทนที่ระบบได้ การคัดค้านการแก้ไขปัญหานี้อาจเป็นไปได้ว่าระบบจะมองหาเส้นทางที่ถูกเปลี่ยนแปลง แต่ก็มีสิ่งหนึ่งที่ easy_install สามารถเขียนไฟล์. pth ได้เช่นกัน
Sacrilicious

2
ฉันไม่รู้ว่าวิธีการชงเป็นวิธีที่ง่าย / ไม่ถูกต้องหรือไม่ - มันเป็นเรื่องของการแก้ปัญหาและการชงกำลังแก้ปัญหาของฉันอย่างน่าทึ่ง - คิดเพียงอย่างเดียวว่าต้องใช้ความพยายามมากแค่ไหนในการเล่นของเล่นใหม่ (ทับทิม 2.2 .3, python3.5, MongoDB, Node4.2.1) อย่างมั่นใจเช่นการพิมพ์คำสั่งและคอมไพล์ใหม่อัปเดตและกำจัดเสียงออก - ดีดังนั้นฉันจึงใช้เส้นทางที่ง่ายแล้ว :) ฉันไม่รู้ว่ามีอะไรบ้าง Python เวอร์ชัน OS ที่จัดส่งมานั้นแตกต่างกันมากนอกเหนือจากการสนับสนุน Cocoa และ Threads และแพ็คเกจจำนวนมากที่ฉันไม่เคยใช้มาก่อนและฉันได้รวบรวมกอง Xcode / เคอร์เนลของฉันอย่างแน่นอน
PJJ

ฉันเพิ่ม elcap.pth ไปยัง /Library/Python/2.7/site-packages ตอนนี้ฉันเห็นเส้นทางนั้นแสดงอยู่ในดัชนี 0 และ 2 ของ sys.path จากนั้นฉันลองsudo pip install --ignore-installed ipythonและมันจะทำงานจนกระทั่ง "กำลังรัน setup.py ติดตั้งสำหรับ pexpect" ซึ่งจุดเล็ก ๆยังคงพยายามอัปเกรดบางอย่างใน /System/Library/Frameworks/Python.framework/Versions/2.7/share และเกิดข้อผิดพลาด
kojiro

การติดตั้ง virtualenv นั้นต้องใช้ pip ดังนั้นจึงไม่ได้แก้ปัญหาใด ๆ ที่เกี่ยวข้องกับการใช้ pip ตามที่เป็นอยู่ฉันกำลังติดตั้งด้วยpip --userและ virtualenv ยังคงไม่ทำงาน
user5359531

4

ฉันคิดว่ามันเป็นเพราะSIPหรือSystem Integrity Protection การป้องกันไฟล์แบบเรียลไทม์ที่ให้ความรู้สึกเหมือน windows anti-virus :) และหยุดการเปลี่ยนแปลงใด ๆ ที่คุณต้องการในโฟลเดอร์ระบบ OS X Apple ตัดสินใจที่จะปิดการใช้งานการปรับเปลี่ยนระบบ - เพื่อให้แน่ใจว่าคุณได้รับการปกป้องอย่างเต็มที่จากความชั่วร้ายของอินเทอร์เน็ตและคอมพิวเตอร์อื่น ๆ ที่เกี่ยวข้องกับกองกำลังชั่วร้ายSIPกำลังปกป้องเราจาก

หากคุณต้องการปิดการใช้งาน SIPคุณต้องบูตเข้าสู่ Recovery HD โดยกดปุ่มCommand + Rพร้อมกันในขณะที่คุณบู๊ตเครื่อง Mac

เปิดเทอร์มินัลจากเมนูยูทิลิตี้แล้วพิมพ์csrutil disableจากนั้นกด Return ไปที่ Apple Menu เพื่อรีบูท

SIP จะถูกปิดการใช้งานนับจากนี้เป็นต้นไป ฉันปิดการใช้งานมานานแล้วและไม่ได้สังเกตเห็นอะไรผิดปกติบางกระบวนการดูเหมือนจะบ่น แต่พวกเขามักจะทำบน OS X ดังนั้นฉันไม่แน่ใจว่ามันเกิดจากการขาด 'การป้องกัน' System Integrity

เคล็ดลับของฉันคือกำจัด SIP และ / หรือใช้ homebrew สำหรับซอฟต์แวร์ opensource / development ของคุณทั้งหมด Homebrew ใช้ไดเร็กทอรี / usr / local สำหรับการติดตั้งและไม่ขัดแย้งกับส่วนประกอบของระบบอื่น ๆ และการสร้างhomebrewนั้นทันสมัยกว่าระบบปฏิบัติการ os x apple


1
มันไม่สมเหตุสมผลเลยที่จะลงคะแนนในคำตอบนี้ แต่อาจมีบางคนบ้าๆบอ ๆ ? +1 จากฉัน ...
bmike

1
ขอบคุณเพื่อน! พยายามใส่อารมณ์ขันบ้าง แต่ไม่ใช่ทุกคนจะต้องสอดคล้องกับความเข้าใจของฉัน)
PJJ

อืม - หลังจากอ่านคำตอบที่เป็นมงคลฉันไม่แน่ใจว่านี่คือ SIP คิด?
bmike

1
นี่คือ SIP ที่ป้องกันการสร้างโฟลเดอร์ (อาจเป็นบางสิ่งที่คล้ายกับ man page) ซึ่งเป็นไดเรกทอรีย่อยของ/System; off-limit ณ วันที่ 10.11 เราสามารถใช้ csrutil เพื่อปิดการใช้งานชั่วคราวหากเราอยู่ในความลำบากเล็กน้อยแม้ว่าฉันรู้ว่าอาจรู้สึกว่ามันสามารถเปลี่ยนเป็น whack-a-mole ได้ แต่นี่ไม่ได้เป็นเหตุผลที่ดีในการจ้างงาน การปล่อยให้เป็น ... ทำไมเราไม่สามารถมีสิ่งที่ดี
Sacrilicious

ฉันได้รับมันตลอดเวลา: 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 และไม่มีเหตุผลที่จะเปิดใช้งานได้เพราะฉันมีระบบของฉันค่อนข้างปิดแน่นและปรับแต่ง
PJJ


4

เชื่อฉันคุณไม่ต้องการให้ห้องสมุดเขียนอะไรในเส้นทางนั้น

ก่อนหน้านี้มันไม่ได้แนะนำ แต่เป็นไปได้ที่จะเขียน/System/Library/Frameworks/Python.framework/Versions/2.7/แต่ตอนนี้มันไม่ได้รับการสนับสนุนเนื่องจาก Apple SIP และดังนั้นจึงเป็นปัญหาเจ้าของห้องสมุด การแจกจ่ายแพ็คเกจควรได้รับการอัพเกรดให้ทำงานอย่างถูกต้องกับการอัพเดทนี้ แพคเกจส่วนใหญ่ได้รับการอัปเดตและติดตั้งเนื้อหาของพวกเขา/Library/Python/2.7/site-packagesแต่บางแพ็คเกจไม่ได้รับการอัปเดต

สำหรับกรณีของฉันมันเป็นห้องสมุดสีเขียวที่พยายามเขียน.hไฟล์ลงในโฟลเดอร์ System Frameworks:

วิธีแก้ไข: sudo -H pip install greenlet --install-option "--install-headers=/Library/Python/2.7/lib/python/includes/" จากนั้นsudo -H pip install gevent

สำหรับ numpy sudo -H pip install --ignore-installed -U numpyแก้ไขคือ

สำหรับไลบรารีอื่น ๆ การแก้ไขแตกต่างจากhttps://github.com/pypa/pip/issues/3177ถึงpip install --ignore-installed sixและpip install --user(อันสุดท้ายติดตั้งทุกอย่างลงใน /User//Library/Python/2.7/ พา ธ ) ดูคำตอบอันดับสูงสุดในปัจจุบันสำหรับโพสต์นี้: https://apple.stackexchange.com/a/210021/169157

หากคุณพิมพ์python -m siteควรรวมไว้ sys.path = [ ... '/Library/Python/2.7/site-packages', ... ] ก่อนหน้าพา ธ ของระบบ - นั่นคือเหตุผล (และวิธี) ที่ใช้งานได้


3

ฉันทำมันดังนี้

brew install python

หลังจากติดตั้งไพ ธ อนแล้ว:

sudo easy_install pip

3
brew install pythonติดตั้ง pip ด้วยแล้ว หากคุณติดตั้ง pip ผ่าน easy_install คุณอาจปิดท้ายด้วยการติดตั้ง pip สองครั้งซึ่งอาจทำให้เกิดปัญหาสับสน
NSSynapse

3

ทางออกที่ยอดเยี่ยมสำหรับปัญหานี้คือใช้ virtualenv (virtualenvwrapper) หลังจากที่คุณสร้างสภาพแวดล้อมใหม่สำหรับโครงการของคุณคุณสามารถใช้ pip โดยไม่มีปัญหาดังนั้นฉันจึงใช้ virtualenvwrapper และทั้งสองบรรทัดนี้แก้ไขปัญหา:

mkproject <project_name>
pip install <package_name>

คุณจะแนะนำให้ติดตั้ง virtualenv ได้อย่างไร? pip install virtualenvหรือ pip ไม่ทำงานและคุณจำเป็นต้องใช้sudo easy_install+1 สำหรับสิ่งที่นี่แล้ว ไชโย
bmike

1
pip ไม่ทำงานเนื่องจากปัญหาการอนุญาตเนื่องจากsudo easy_installทำงานได้
neosergio

2

ฉันมี python3 ติดตั้งอยู่บน mac ของฉันในขณะที่ python2.7 ดั้งเดิมมาพร้อมกับ OSX ดังนั้นเมื่อใดก็ตามที่ฉันต้องการเรียกใช้ python3 ฉันแค่พิมพ์ $ python3 .... บางทีคุณควรลองใช้ $ python3 get-pip.py ซึ่งจะได้ผลกับฉันเมื่อฉันมีปัญหาเกือบเหมือนกันกับคุณ


2

สรุป

ฉันพบปัญหานี้ใน Mac OS X 10.11.6 (ซึ่งมี SIP) เพราะฉันติดตั้ง pip โดยใช้ System easy_install และ local-install.pth ง่าย ๆ ที่อ้างถึงไลบรารีระบบ
เมื่อติดตั้งแพคเกจที่ตามมาด้วย pip บางส่วนของการพึ่งพาได้รับการแก้ไขไปยังห้องสมุด Python ระบบเก่า
ทางออกคือการลบไลบรารี่ที่ติดตั้งในเครื่องของฉันและติดตั้งไพ ธ อนแบบโลคัล (ซึ่งรวมถึง pip) จากhttps://www.python.org/downloads/เพื่อให้ระบบและอินสแตนซ์ของไพ ธ อนที่ติดตั้งไว้ในเครื่องนั้นแยกจากกัน
ฉันได้ลองใช้การแก้ไข fix_mac_path.pth ในคำตอบโดย @mfrippแต่ฉันพบว่าการลบและติดตั้งใหม่สะอาดกว่า

สาเหตุ

(อย่าทำตามขั้นตอนเหล่านี้)

ฉันพบปัญหานี้ขณะพยายามติดตั้ง Ansible ฉันติดตามเอกสาร Ansible สำหรับการติดตั้งบน OS X ผ่าน pip
ก่อนอื่นฉันติดตั้ง pip ด้วยsudo easy_install pip
สิ่งนี้ใช้ระบบ easy_install ที่/usr/bin/easy_installและติดตั้ง pip ที่/Library/Python/2.7/site-packages/pip
ฉันได้รับคำเตือนดังต่อไปนี้เมื่อทำการติดตั้ง pip แต่ฉันเพิกเฉยและทำการสุ่มสี่สุ่มห้า

/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

ต่อมาดูที่/Library/Python/2.7/site-packages/easy-install.pthมันดูเหมือนนี้

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)

จากนั้นฉันติดตั้ง ansible ผ่าน pip

sudo pip install ansible

ฉันได้รับข้อความแจ้งว่ามีการปฏิบัติตามข้อกำหนดของไลบรารีระบบแล้ว

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)

จากนั้นเมื่อเรียกใช้ ansible ฉันพบปัญหานี้

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

และการตรวจสอบ pip พบว่า paramiko ต้องการ setuptools ที่ใหม่กว่า

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.

โปรดทราบว่า ansible setuptools ที่จำเป็นเท่านั้น (ไม่มีรุ่น) ดังนั้น pip รายงานการพึ่งพาที่พอใจโดย setuptools ระบบ

วิธีการแก้

ฉันได้รับการแก้ไขได้โดยการถอนการติดตั้งห้องสมุดหลามท้องถิ่นใด ๆ โดยใช้กระบวนการนัยhttps://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython
สำหรับผมมีส่วนร่วมนี้

sudo rm -rf /Library/Python

จากนั้นฉันก็ลบ symlink และ executables ใน / usr / local / bin เช่น

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*

และอื่น ๆ ฉันลบแอปพลิเคชันใด ๆ ด้วย

sudo rm -rf /Applications/Python\ 2.7/

ฉันดาวน์โหลดแพคเกจตัวติดตั้ง 2.7.13 สำหรับ Mac OS X จากhttps://www.python.org/downloads/ และติดตั้ง

สิ่งนี้ติดตั้งไพ ธ อนและ pip ​​ที่/Library/Frameworks/Python.framework/Versions/2.7และ symlink /usr/local/binซึ่งแยกจากไลบรารีระบบที่/System/Library/Frameworks/Python.frameworkและ/usr/bin เพื่อให้ฉันได้รับ

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

และใน pip list

setuptools (28.8.0)
six (1.10.0)

ansible ตอนนี้ใช้ได้สำหรับฉัน


1

สำหรับฉันแล้วสิ่งที่PATHขาดหายไปpipนี่เป็นข้อยืนยันจากการวิ่งpython -m pip

สองโซลูชั่นที่มีศักยภาพที่นี่เพิ่มกลับไปpip PATHในกรณีของฉันpipล้าสมัยอยู่แล้วดังนั้นการอัปเกรดให้แก้ไข:

python -m pip install --upgrade pip

✗ pip --version pip 9.0.1 from /Library/Python/2.7/site-packages (python 2.7)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.