ปัญหานี้มักเกิดขึ้นเมื่อ 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:
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'
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
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/
แต่แล้วเมื่อคุณเรียกหลามคุณจะได้รับรุ่นเก่าจาก สิ่งนี้ทำให้เป็นไปไม่ได้ที่จะใช้แพ็คเกจใหม่ที่มีชื่อเหมือนกับโมดูลจากไลบรารีมาตรฐาน
คุณสามารถแก้ไขปัญหาเหล่านี้ได้ แต่วิธีการนั้นขึ้นอยู่กับคำตอบของคุณสำหรับสามคำถาม
- คุณต้องการใช้ Python เวอร์ชัน Mac OS X ต่อไปหรือติดตั้งของคุณเองหรือ การติดตั้งของคุณเองเป็นตัวเลือกที่ปลอดภัยที่สุดและสามารถทำได้ผ่านตัวติดตั้ง Python อย่างเป็นทางการ Homebrew หรือ Anaconda และนี่ก็เป็นสิ่งที่แอปเปิ้ลแนะนำเป็นแหลมออกโดย @Sacrilicious หากคุณติดตั้ง Python เวอร์ชันของคุณเองคุณอาจจะถอนการติดตั้งสิ่งที่ติดตั้งไว้ในปัจจุบัน
/Library/Python/2.7/site-packages
และสคริปต์ใด ๆ ที่ติดตั้งไว้/usr/local/bin
สำหรับแพ็คเกจเหล่านั้น (รวมถึง pip) มิฉะนั้นคุณจะมีประสบการณ์ที่น่ารำคาญของสคริปต์บางตัวที่เข้าถึง Python เวอร์ชันที่ติดตั้งระบบและบางตัวจะเข้าถึงการติดตั้งของคุณเอง
หากคุณต้องการติดตั้ง Python ที่ติดตั้งระบบคุณจะต้องทำการตัดสินใจอีกสองครั้ง:
คุณต้องการติดตั้งแพ็กเกจสำหรับผู้ใช้ทั้งหมดหรือเพียงเพื่อตัวคุณเอง? การติดตั้งสำหรับผู้ใช้ทั้งหมดทำให้มั่นใจได้ว่าทุกโปรแกรมที่ใช้ Python (รวมถึงสคริปต์การดูแลระบบ) จะสามารถเข้าถึงแพ็คเกจทั้งหมดที่คุณติดตั้ง อย่างไรก็ตามมีโอกาสที่จะรบกวนการใช้ Python ของ El Capitan (ฉันหวังว่า Apple จะใช้python -S
เพื่อให้แน่ใจว่าพวกเขาได้รับแพ็คเกจที่คาดหวังเสมอ แต่ฉันไม่มีวิธีทดสอบสิ่งนี้) การติดตั้งสำหรับบัญชีผู้ใช้ของคุณเองเท่านั้น หมายเหตุ: หากคุณกำลังจะเปลี่ยนจากการติดตั้งทั้งระบบให้กับผู้ใช้อย่างเดียวคุณอาจจะใช้โอกาสนี้ในการถอนการติดตั้งสิ่งที่ติดตั้งอยู่ในปัจจุบันและสคริปต์ที่เกี่ยวข้องใน/Library/Python/2.7/site-packages
/usr/local/bin
คุณต้องการซ่อนแพ็กเกจพิเศษที่ติดตั้งกับ 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>