Làm thế nào để sử dụng pip sau khi nâng cấp OS X El Capitan?


116

Sau bản cập nhật El Capitan, tôi không thể chạy cài đặt pip. Lỗi tôi nhận được là "thao tác không được phép" khi pip cố gắng tạo thư mục mới trong khi cài đặt.

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

Trong thực tế, nói chung tôi không thể tạo các thư mục vv trong các thư mục này. Đã thử sử dụng sudo mà không giúp được. Ngoài ra tôi đã làm

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

Ở trên cũng không giúp được gì. Tôi có thể làm gì để có thể cài đặt thư viện python một cách trơn tru?


1
Pip trên hệ thống của bạn ở đâu?
dùng151019

$ trong đó pip / usr / local / bin / pip
web_ninja

$ Pip pip --version 7.1.2 từ /Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg (python 2.7)
web_ninja

Bạn đã cài đặt pip như thế nào - nó nên ghi vào /
L Library

Tôi không nhớ bây giờ. Tôi đã tìm ra sau khi đăng bình luận đó là vấn đề và đã sử dụng brew để cài đặt python và điều đó đã sửa vị trí của pip.
web_ninja

Câu trả lời:


84

Một giải pháp nhanh chóng là sử dụng homebrew để cài đặt pythonvào /usr/local/binđể bạn pipcó thể chạy với một khuôn khổ python sử dụng sửa đổi.

brew install python
pip --version

Vô hiệu hóa Bảo vệ Tính toàn vẹn của Hệ thống cũng là một tùy chọn, nhưng tôi không khuyến nghị rằng đối với bất kỳ thứ gì ngoại trừ các máy chủ có tường được quản lý chuyên nghiệp, nơi bạn có nhân lực để quản lý phát hiện xâm nhập hoặc nếu bạn là nhà phát triển / sysadmin và cần kiểm tra mọi thứ có và không có MỘT HỚP.

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

Bạn sẽ thấy rằng cờ bị hạn chế được đặt mà không thể xóa ngay cả khi root trong khi SIP được kích hoạt.

Sử dụng homebrew cho phép quản lý pip và python riêng biệt so với phiên bản do hệ thống cung cấp. Như một phần thưởng, khung homebrew được thiết kế để dễ dàng bảo trì và vá / công việc thông qua tự động hóa.


1
Con trăn cài đặt bia không ổn định và nó gặp sự cố ngẫu nhiên
jayatubi

@jayatubi Gói hoặc tập lệnh nào không ổn định cho bạn? Bạn đang cài đặt python 2.7.10 từ brew hay python3 vừa gặp một lỗi lớn và được biết là không tương thích ngược. Bạn có thể chọn từ hàng tá phiên bản nếu bạn thích một phiên bản ổn định hơn hoặc ít hơn cho nhu cầu của bạn.
bmike

1
Đồng ý rằng brew install pythonlà lựa chọn đơn giản nhất, mặc dù dọn dẹp một số thiết lập khác có thể được yêu cầu nếu bạn đã sử dụng Python hệ thống trong một thời gian (ví dụ file Python gốc nước thuộc /usr/local/bin~/Library/Caches/pip)
RichVel

Tải xuống một python đã biên dịch .pkg từ vd: python.org/doads/release/python-2712 hoạt động tốt với tôi, vào ngày 10.8. Bất kỳ ý kiến ​​về điều đó so với homebrew? Cảm ơn
denis

@denis Tôi thích brewvì dễ dàng ghim một phiên bản bạn thích - quản lý nhiều phiên bản khác nhau hoặc giữ cho mọi thứ được cập nhật thường xuyên. Tuy nhiên, nếu bạn có thứ gì đó phù hợp với mình - thật khó để tranh luận bạn nên thay đổi bất cứ điều gì.
bmike

77

Một tùy chọn khả thi khác mà không cần phải tắt SIP hoặc cài đặt các phiên bản Python khác, là chỉ cài đặt các mô-đun cho người dùng hiện tại bằng cách sử dụng

pip install --user <modulename>

Nếu đó chỉ là máy cá nhân của bạn, đây sẽ là giải pháp đơn giản và an toàn nhất.


1
Có thể El Capitan đã cung cấp / usr / bin / pip, nhưng macOS Sierra thì không.
sigjuice

1
Hoạt động trên sierra
harryparkdotio 16/2/2017

57

Vấn đề này thường phát sinh khi pip cố gắng cài đặt một trang web cho IPython trên El Capitan. Cách khắc phục nhanh là sử dụng lệnh pip như thế này:

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

Tuy nhiên, Bảo vệ toàn vẹn hệ thống (SIP) trên El Capitan chặn một số thực tiễn xấu với pip được sử dụng để trượt, do đó bạn có thể cần thực hiện thêm một số thay đổi để giúp pip hoạt động trơn tru trên El Capitan.

SIP trên El Capitan cho thấy ba vấn đề khi sử dụng pip với phiên bản Python do Apple cung cấp trên OS X:

  1. distutils không đặt chính xác hai biến quan trọng trên máy Mac, vì vậy pip cố gắng viết tiêu đề và các tệp được chia sẻ khác (ví dụ: manpages) bên dưới /System/Library/Frameworks/Python.framework/Versions/2.7/. Đây là một ý tưởng tồi, nhưng trong các phiên bản trước của OS X, nó đã thành công nếu pip được chạy với sudo. Tuy nhiên, nó thất bại trên El Capitan do SIP. Đây là lỗi bạn gặp phải. Nó cung cấp các thông điệp nhưOSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'

  2. Apple cài đặt các phiên bản lỗi thời của một số gói trong /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/(ví dụ: sáu). Trên các phiên bản trước của OS X, khi bạn cài đặt gói cần phiên bản mới hơn của một trong số đó, sudo pipsẽ âm thầm xóa phiên bản cũ khỏi /System/thư mục và cài đặt phiên bản mới hơn /Library/Python/2.7/site-packages. Đây cũng là một ý tưởng tồi và không còn có thể với SIP. Nhưng bây giờ pip sẽ gặp sự cố với thông báo lỗi trong khi cố gắng xóa gói cũ. Tin nhắn đó cũng được OSError: [Errno: 1], nhưng nó đến sau một tin nhắn như thế nào Uninstalling six-1.4.1:. Xem, ví dụ: https://github.com/pypa/pip/issues/3165 .

  3. Phiên bản Python của Apple thêm một số thư mục /System/Library/Frameworks/Python.framework/Versions/2.7/vào đường dẫn tìm kiếm python phía trên các vị trí cài đặt gói người dùng có thể truy cập tiêu chuẩn. Vì vậy, nếu bạn cài đặt phiên bản mới hơn của gói ở nơi khác (ví dụ sudo -H pip install --ignore-installed six:), bạn sẽ nhận được thông báo rằng quá trình cài đặt đã thành công, nhưng sau đó khi bạn chạy python, bạn sẽ nhận được phiên bản cũ hơn /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/. Điều này cũng làm cho không thể sử dụng các gói mới có cùng tên với các mô-đun từ thư viện chuẩn.

Bạn có thể giải quyết những vấn đề này, nhưng phương pháp phụ thuộc vào câu trả lời của bạn cho ba câu hỏi.

  1. Bạn có muốn tiếp tục sử dụng phiên bản Mac OS X của Python hoặc cài đặt của riêng bạn không? Cài đặt của riêng bạn là tùy chọn an toàn nhất và có thể được thực hiện thông qua trình cài đặt Python chính thức, Homebrew hoặc Anaconda. Đây cũng là những gì Apple khuyến nghị , như được chỉ ra bởi @Sacrilicy . Nếu bạn cài đặt phiên bản Python của riêng mình, có lẽ bạn nên gỡ cài đặt mọi thứ hiện được cài đặt /Library/Python/2.7/site-packagesvà bất kỳ tập lệnh nào được cài đặt /usr/local/bincho các gói đó (bao gồm cả pip). Nếu không, bạn sẽ có trải nghiệm khó chịu khi một số tập lệnh truy cập phiên bản Python được cài đặt hệ thống và một số truy cập cài đặt của riêng bạn.

Nếu bạn muốn gắn bó với Python được cài đặt hệ thống, thì bạn phải đưa ra hai quyết định nữa:

  1. Bạn có muốn cài đặt các gói cho tất cả người dùng, hoặc chỉ cho chính mình? Cài đặt cho tất cả người dùng đảm bảo rằng mọi chương trình sử dụng Python (bao gồm cả các tập lệnh quản trị) sẽ có quyền truy cập vào tất cả các gói bạn cài đặt. Tuy nhiên, có một cơ hội xa rằng nó sẽ can thiệp vào việc sử dụng Python của El Capitan. (Tôi hy vọng rằng Apple sử dụng python -Sđể đảm bảo họ luôn nhận được gói họ mong đợi, nhưng tôi không có cách nào để kiểm tra điều này.) Cài đặt chỉ dành riêng cho tài khoản người dùng của riêng bạn loại bỏ khả năng can thiệp vào quá trình cài đặt hệ thống Python. Lưu ý: nếu bạn định chuyển từ cài đặt toàn hệ thống sang chỉ dành cho người dùng, có lẽ bạn nên tận dụng cơ hội này để gỡ cài đặt mọi thứ hiện được cài đặt /Library/Python/2.7/site-packagesvà các tập lệnh liên quan /usr/local/bin.

  2. Bạn có muốn ẩn các gói bổ sung được cài đặt với phiên bản OS X của Python (bên dưới /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/) hoặc giữ chúng trong đường dẫn tìm kiếm không? Tôi khuyên bạn nên ẩn chúng, để các phiên bản mới nhất của các gói này sẽ tự động được cài đặt ở các vị trí người dùng có thể truy cập khi cần. Nếu bạn không ẩn thư mục này, đôi khi bạn sẽ nhận được thông báo rằng pip không thể xóa gói hiện có để nâng cấp lên phiên bản mới hơn (cần một gói khác mà bạn đang cài đặt). Trong trường hợp đó, bạn sẽ cần chạy pip install --ignore-installed <package>, nó sẽ cài đặt phiên bản mới hơn và ẩn phiên bản cài đặt hệ thống. Tuy nhiên, nếu bạn che giấu toàn bộ/System/.../Extras/...thư mục, bạn sẽ mất quyền truy cập vào một số gói Apple không có sẵn thông qua pip, tức là CoreGraphics và bonjour. (Nếu bạn cần những thứ này, bạn có thể có quyền truy cập bằng cách liên kết chúng vào thư mục gói trang web của bạn.)

Bây giờ, đây là cách giải quyết. Đây sẽ là cách thực hành tốt trên tất cả các phiên bản OS X, để tránh vô tình thay thế hoặc xóa các gói Python được sử dụng bởi hệ điều hành; tuy nhiên, chúng rất cần thiết nếu bạn muốn sử dụng các gói do người dùng cài đặt với phiên bản Python do Apple cung cấp trên OS X El Capitan (10.11).

Cài đặt pip

Bạn có thể đã làm điều này rồi, nhưng nếu không, bạn có thể sử dụng lệnh sau để cài đặt pip cho tất cả người dùng :

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

Hoặc sử dụng lệnh này để cài đặt pip cho tài khoản người dùng của riêng bạn :

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

Quản lý vị trí tệp được chia sẻ

Nếu bạn đang cài đặt các gói cho tất cả người dùng, hãy tạo một tệp có tên .pydistutils.cfg với các dòng này (từ https://github.com/pypa/pip/issues/426 ):

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

Nếu bạn thường sử dụng sudo -H pip ..., thì bạn nên đặt tệp này vào /var/root(thư mục chính cho người dùng root). Nếu bạn thường sử dụng sudo pip ..., thì bạn nên đặt tệp này vào thư mục nhà của riêng bạn (~).

Các cài đặt này sẽ ngăn pip cố gắng ghi các mục được chia sẻ như tiêu đề và trang hướng dẫn bên dưới /Library/System. (Lệnh ở đầu câu trả lời này là một phiên bản nhanh hơn trong những điều tương tự.) Các thiết lập này là cần thiết bởi vì mã darwin cụ thể trong /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.pythất bại trong việc thiết lập các biến đến các địa điểm gốc có khả năng ghi (mặc dù nó đặt biến khác một cách chính xác). Có nhiều thông tin hơn về điều này tại https://github.com/pypa/pip/issues/3177 .

Nếu bạn chỉ cài đặt các gói cho tài khoản người dùng của riêng mình, các mục được chia sẻ sẽ tự động được cài đặt bên dưới ~/Library/Python/2.7/. Nhưng bạn nên thêm các dòng sau vào ~ / .profile để các mục được chia sẻ sẽ được tìm thấy khi bạn cần chúng:

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

Lưu ý: bạn sẽ cần khởi động một shell mới hoặc chạy chúng trên dòng lệnh để các thay đổi có hiệu lực. Bạn cũng có thể muốn chạy hash -rnếu gần đây bạn đã xóa các tập lệnh cũ khỏi đường dẫn.

Quản lý đường dẫn Python

Bạn sẽ cần đảm bảo rằng các gói bạn cài đặt theo thứ tự tìm kiếm của Python cao hơn các gói được cài đặt hệ thống. Cách dễ nhất để làm điều này là với .pthcác tập tin. Điều này tuân theo đề xuất của @ Sacrilicy ở những nơi khác trên trang này , nhưng đảm bảo rằng thư mục gói trang web người dùng của bạn được tìm kiếm trước thư mục gói trang web toàn hệ thống của bạn và cả hai đều được tìm kiếm trước thư viện chuẩn và thư mục Extras của Apple (cả trong / System /. ..). Nó cũng bỏ qua /System/.../Extrastừ đường dẫn tìm kiếm nếu muốn.

Tạo một tập tin được gọi fix_mac_path.pth, với văn bản dưới đây. Nếu bạn đang cài đặt các gói cho tất cả người dùng, fix_mac_path.pth nên được đặt trong /Library/Python/2.7/site-packages. Nếu bạn chỉ cài đặt cho người dùng của riêng mình, fix_mac_path.pth nên ở trong ~ / Library / Python / 2.7 / lib / python / site-gói. (Tệp này có thể có bất kỳ tên nào bạn muốn, nhưng nó phải được đặt ở một hoặc cả hai vị trí này và nó phải kết thúc bằng .pth; ngoài ra, tất cả văn bản trong tệp này phải nằm trên một dòng.)

Nếu bạn muốn ẩn các gói do Apple cài đặt trong /System/.../Extras:

Trước tiên hãy chạy một trong các lệnh sau để có được bản sao hoạt động của pip / setuptools độc lập với phiên bản do Apple cung cấp:

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

Sau đó đặt mã sau fix_mac_path.pthvào vị trí được chỉ định ở trên:

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

Nếu bạn muốn tiếp tục sử dụng các gói do Apple cài đặt, bạn không cần phải cài đặt một bản sao khác của setuptools. Chỉ cần đặt mã sau fix_mac_path.pthvào vị trí được chỉ định ở trên:

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

Sau này, bạn có thể sử dụng python -m siteđể đảm bảo thứ tự tìm kiếm đường dẫn có ý nghĩa.

Cài đặt gói

Sau này, bạn sẽ có thể cài đặt các gói mới bằng một trong các lệnh sau.

Cho tất cả người dùng:

sudo -H pip install <package>

Đối với người dùng của riêng bạn:

pip install --user <package>

Hướng rất rõ ràng với các lựa chọn thay thế đánh vần. Tôi đã làm theo hướng dẫn này và thành công đã có thể vượt qua vấn đề thư viện "sáu", cho phép tôi cài đặt mitmproxy.
Paul Chernoch

1
Đây thực sự là một trong những câu trả lời hữu ích, đầy đủ và hữu ích nhất mà tôi từng gặp trên stackoverflow. Làm tốt lắm, và cảm ơn.
cmsjr

@cmsjr, cảm ơn! Phải mất một thời gian để tôi hiểu được chuyện gì đang xảy ra, và điều này cho tôi một nơi tốt để tham khảo lại!
Matthias Fripp

4
Cho đến nay, lời giải thích rõ ràng và đầy đủ nhất mà tôi đã thấy về lĩnh vực này, đặc biệt là dọn dẹp hệ thống Python lộn xộn hiện có - cảm ơn bạn! Cải tiến chính của tôi sẽ được khuyến nghị mạnh mẽ hơn khi sử dụng Python cài đặt bia, vì điều này rất dễ dàng và cung cấp một thiết lập sạch không yêu cầu sudo. Điều này là ngoài virtualenvs cho các dự án phát triển.
RichVel

Thật là một thảm họa. Chúa phù hộ bạn.
Matt M.

31

Đầu tiên, bạn không vô hiệu hóa SIP như một cách để giải quyết vấn đề. Xin lỗi đó là lý do khiến việc tạo thư mục này thất bại, nhưng chúng tôi phải làm việc xung quanh nó. Thứ hai, bạn mất tất cả những thứ tốt đẹp mà Apple nghĩ rằng họ đang tặng bạn, giống như một cây cầu thông qua pyObjC, khi bạn cài đặt Python của riêng bạn.
(Tôi sẽ thừa nhận, họ nói rằng bạn nên tự cài đặt /usr/localnếu bạn là nhà phát triển, tôi chỉ phản đối việc thực hiện nó một cách dễ dàng với brew.)

Về mặt logic, bạn nghĩ sẽ cài đặt nó ở đâu đó SIP không chặn bạn và điều này gần như chắc chắn một số pip phụ thuộc đang giải quyết cho bạn. Nói với pip nơi bạn muốn nó thực hiện cài đặt không phải là biện pháp khắc phục cũng như việc nó bỏ qua các nội dung có sẵn trong / Hệ thống, nơi nó sẽ kiểm tra các phụ thuộc cho nhiều cài đặt phổ biến cần, ví dụ six, và SIP gây ra pip để phá vỡ chính nó khi nó đi để thử và nâng cấp nó. Đó thực sự là hành vi mặc định của pip để cài đặt vào / L Library / Python / 2.7 / site-packages, bạn chỉ cần nói --ignore-installedđể buộc nó cài đặt bất kỳ phiên bản phụ thuộc nào được cập nhật ở đó.
... Thật không may, sau đó bạn có thể nhập mô-đun này trong một phiên hoặc kịch bản tương tác và nhận được các lỗi chất béo tốt - nó vẫn đang xem xét / Gói chưa được nâng cấp của Hệ thống!

Kể từ ngày thiết lập sớm, Python có một cách để làm cho việc tra cứu đó rõ ràng. Nó trông hơi kỳ quặc, (và nên gợi ý tạm dừng cho những người trong chúng ta có ý thức bảo mật và không vui mừng về sự thẳng thừng của việc đẩy nó lên đầu danh sách mà không cần kiểm tra, nhưng) bạn có thể đặt một tệp kết thúc bằng .pth( ví dụ: 'elcap.pth') /Library/Python/2.7/site-packagesđể đẩy thư mục đó lên phía trước thứ tự tra cứu với nội dung sau:
import sys; sys.path = ['/Library/Python/2.7/site-packages'] + sys.path

Bắt đầu một phiên mới và một chuyến đi nhanh python -m sitesẽ xác nhận rằng bạn đã chèn đường dẫn đó vào vị trí đầu tiên và việc nhập các mô-đun sẽ hoạt động.

Ồ, và sau tất cả những điều này, hãy thử cài đặt với --usertùy chọn của pip hoặc sử dụng virtualenv - đó là cách tốt nhất cho hầu hết mọi người.


1
Bây giờ điều này là thanh lịch và là một đối trọng tốt với giải pháp "từ bỏ hệ thống Python và ủ nó" đơn giản của tôi. Nếu bạn cần nhanh chóng và bẩn thỉu, điều này có thể không đáng để nỗ lực, nhưng giữ pyObjC và một con trăn có công rất lớn.
bmike

2
Nhiều pythonic và hợp lý hơn sẽ được cài đặt --userhoặc sử dụng virtualenv. Tôi chỉ là một sysadmin, rằng bạn cài đặt một lần cho một hệ thống và người dùng sẽ có thể ghi đè hệ thống. Sự phản đối đối với giải pháp này có thể là hệ thống sẽ xem xét một đường dẫn bị thay đổi, nhưng có một tiền lệ là easy_install cũng có thể viết một tệp .pth.
Sắc sảo

2
Tôi không biết cách pha cà phê là cách dễ / sai - đó là vấn đề giải quyết vấn đề, và brew đang giải quyết vấn đề của tôi một cách ngoạn mục - nghĩ một mình về việc sẽ mất bao nhiêu nỗ lực để chơi với đồ chơi mới (ruby 2.2 .3, python3.5, MongoDB, Node4.2.1) theo cách thuận tiện, như gõ một lệnh và nó biên dịch lại, cập nhật và đưa ra thông báo - tốt, vì vậy tôi đi theo con đường dễ dàng :) Tôi không biết những gì phiên bản OS X được vận chuyển của Python rất khác biệt với sự hỗ trợ của Cacao và Chủ đề và rất nhiều gói tôi chưa từng sử dụng trước đây và tôi thực sự đã biên soạn đống công cụ Xcode / Kernel của mình
PJJ

Tôi đã thêm elcap.pth vào / L Library / Python / 2.7 / site-packages, bây giờ tôi thấy đường dẫn được liệt kê ở 0 và 2 chỉ số của sys.path. Sau đó, tôi đã thử sudo pip install --ignore-installed ipythonvà nó chạy cho đến khi "Chạy setup.py cài đặt để khai thác", tại thời điểm đó, Pip vẫn cố gắng nâng cấp một cái gì đó trong / System / L Library / Frameworks / Python.framework / Warions / 2.7 / share và lỗi.
kojiro

Cài đặt virtualenv yêu cầu sử dụng pip, do đó không thực sự giải quyết bất kỳ vấn đề nào liên quan đến việc sử dụng pip. Như vậy, tôi đang cài đặt nó pip --uservà virtualenv vẫn không hoạt động.
dùng5359531

4

Tôi nghĩ đó là do SIP hoặc Bảo vệ toàn vẹn hệ thống , một loại bảo vệ tệp thời gian thực có cảm giác như chống vi-rút windows :) và dừng mọi thay đổi bạn muốn thực hiện trong các thư mục hệ thống OS X. Apple chỉ đơn giản quyết định vô hiệu hóa các sửa đổi hệ thống - để chắc chắn rằng bạn được bảo vệ hoàn toàn khỏi sự xấu xa của internet và các thế lực xấu khác liên quan đến máy tính mà SIP đang bảo vệ chúng ta khỏi.

Nếu bạn muốn tắt SIP, bạn cần khởi động vào Recovery HD bằng cách giữ đồng thời các phím Command + R khi bạn khởi động máy Mac.

Mở thiết bị đầu cuối từ menu Tiện ích và nhập csrutil disable, sau đó nhấn return. Chuyển đến Menu Apple để khởi động lại.

SIP sẽ bị vô hiệu hóa kể từ bây giờ. Tôi đã vô hiệu hóa nó từ lâu và không nhận thấy bất cứ điều gì sai, một số quy trình có vẻ phàn nàn nhưng họ luôn làm như vậy trên OS X vì vậy tôi không chắc liệu có phải do thiếu tính bảo vệ của tính toàn vẹn hệ thống '

Mẹo của tôi là loại bỏ hoàn toàn SIP và / hoặc sử dụng homebrew cho tất cả các phần mềm phát triển / mã nguồn mở của bạn. Homebrew sử dụng thư mục / usr / local cho phần cài đặt của nó và không va chạm với các thành phần hệ thống khác, và các bản dựng homebrew được cập nhật hơn sau đó là bản dựng os x apple.


1
Nó không có ý nghĩa để bỏ phiếu câu trả lời này. Nhưng, có lẽ ai đó chỉ cáu kỉnh? +1 từ tôi ...
bmike

1
Cảm ơn bạn đời! Đã cố gắng để đưa ra một số sự hài hước, nhưng không phải ai cũng phải phù hợp với sự hiểu biết của tôi về nó;)
PJJ

Hmm - sau khi đọc câu trả lời của sacrilicy , tôi không chắc đây là SIP. Suy nghĩ?
bmike

1
Đây thực sự là SIP ngăn chặn việc tạo một thư mục (có thể cho một cái gì đó giống như trang con người) như là một thư mục con của /System; ngoài giới hạn kể từ ngày 10.11. Chúng ta có thể sử dụng csrutil để tạm thời vô hiệu hóa nó nếu chúng ta đang ở trong tình trạng khó khăn, mặc dù tôi biết rằng nó có thể cảm thấy như nó có thể biến thành một nốt ruồi, nhưng đây có vẻ không phải là lý do chính đáng để sử dụng nó. Bỏ nó đi là vì sao chúng ta không thể có những thứ tốt đẹp.
Sắc sảo

Tôi đã nhận nó tắt tất cả các thời gian: 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 và không có một lý do để kích hoạt nó kể từ khi tôi có hệ thống của tôi khá chặt chẽ đóng cửa và tùy chỉnh
PJJ

4

Được sử dụng pip3 install <package>thay thế và giải quyết vấn đề cho phép trong pip.


4

Tin tôi đi, bạn không thực sự muốn thư viện viết bất cứ điều gì trên con đường đó.

Trước đây nó không được khuyến nghị, nhưng có thể viết vào /System/Library/Frameworks/Python.framework/Versions/2.7/, nhưng bây giờ nó không được hỗ trợ do Apple SIP và do đó, đây là vấn đề của chủ sở hữu thư viện. Phân phối gói nên được nâng cấp để hoạt động chính xác với bản cập nhật này. Hầu hết các gói đã được cập nhật và cài đặt nội dung của chúng /Library/Python/2.7/site-packages, nhưng một số gói không được cập nhật.

Đối với trường hợp của tôi, đó là thư viện greenlet đang cố gắng ghi .htệp của nó vào thư mục Khung hệ thống:

Cách khắc phục: sudo -H pip install greenlet --install-option "--install-headers=/Library/Python/2.7/lib/python/includes/" sau đósudo -H pip install gevent

Đối với numpy, sửa chữa là sudo -H pip install --ignore-installed -U numpy.

Đối với các thư viện khác, các bản sửa lỗi khác nhau từ https://github.com/pypa/pip/issues/3177 đến pip install --ignore-installed sixpip install --user(lần cuối cài đặt mọi thứ vào đường dẫn /User//L Library / Python / 2.7 /). Xem thêm câu trả lời hàng đầu hiện tại cho bài đăng này: https://apple.stackexchange.com/a/210021/169157

Nếu bạn nhập python -m sitenó sẽ bao gồm sys.path = [ ... '/Library/Python/2.7/site-packages', ... ] trước các đường dẫn hệ thống - đó là lý do tại sao (và làm thế nào) nó hoạt động.


3

Tôi đã làm như sau:

brew install python

sau khi python được cài đặt:

sudo easy_install pip

3
brew install pythonđã cài đặt pip với nó. Nếu sau đó bạn cài đặt pip thông qua easy_install, có thể bạn sẽ gặp phải hai lần cài đặt pip có thể dẫn đến các vấn đề khó hiểu.
NSSynapse

3

Một giải pháp rất hay cho vấn đề này là sử dụng virtualenv (virtualenvwrapper), sau khi bạn tạo môi trường mới cho dự án của mình, bạn có thể sử dụng pip mà không gặp sự cố, vì vậy tôi đã sử dụng virtualenvwrapper và hai dòng này khắc phục vấn đề:

mkproject <project_name>
pip install <package_name>

Làm thế nào để bạn khuyên bạn nên cài đặt virtualenv? pip install virtualenvhoặc là pip không hoạt động và bạn cần phải sử dụng sudo easy_install+1 cho những gì đã có ở đây. Chúc mừng
bmike

1
Pip không hoạt động do vấn đề quyền hạn, do đó, sudo easy_installhoạt động
neosergio

2

Tôi đã cài đặt python3 trên máy mac của mình trong khi python2.7 ban đầu đi kèm với OSX. Vì vậy, bất cứ khi nào tôi muốn gọi python3, tôi chỉ cần gõ $ python3 .... Có lẽ bạn nên thử $ python3 get-pip.py, điều này hiệu quả với tôi khi tôi gặp vấn đề gần như tương tự với bạn.


2

Tóm lược

Tôi gặp sự cố này trên Mac OS X 10.11.6 (có SIP) vì tôi đã cài đặt pip bằng System easy_install và local-install.pth được gọi là thư viện hệ thống.
Khi cài đặt các gói tiếp theo với pip, một số phụ thuộc đã được phân giải thành các thư viện Python hệ thống cũ.
Giải pháp là xóa các thư viện được cài đặt cục bộ của tôi và cài đặt lại phiên bản python cục bộ (bao gồm pip) từ https://www.python.org/doads/ để các phiên bản python được cài đặt cục bộ được giữ riêng biệt.
Tôi đã thử sử dụng fix_mac_path.pth fix trong câu trả lời của @mfripp tuy nhiên tôi thấy gỡ bỏ và cài đặt lại sạch hơn.

Nguyên nhân

(Đừng làm theo các bước này)

Tôi gặp vấn đề này trong khi cố gắng cài đặt Ansible. Tôi đã theo dõi các tài liệu Ansible để cài đặt trên OS X qua pip
Đầu tiên tôi đã cài đặt pip với sudo easy_install pip
Điều này đã sử dụng System easy_install tại /usr/bin/easy_installvà cài đặt pip khi /Library/Python/2.7/site-packages/pip
tôi nhận được các cảnh báo như sau khi cài đặt pip nhưng tôi đã bỏ qua chúng và cày mù.

/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

Sau này nhìn vào /Library/Python/2.7/site-packages/easy-install.pth, nó trông như thế này

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)

Sau đó, tôi cài đặt ansible qua pip

sudo pip install ansible

Tôi nhận được thông báo nói rằng các yêu cầu đã được các thư viện hệ thống đáp ứng

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)

Sau đó, khi chạy ansible tôi đã gặp vấn đề này

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

và kiểm tra pip cho thấy paramiko yêu cầu một công cụ thiết lập mới hơn

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.

Lưu ý rằng các công cụ thiết lập chỉ yêu cầu (không có phiên bản) và vì vậy pip đã báo cáo sự phụ thuộc được thỏa mãn bởi các công cụ thiết lập hệ thống.

Giải pháp

Tôi đã giải quyết nó bằng cách gỡ cài đặt bất kỳ thư viện python cục bộ nào bằng cách sử dụng quy trình được gợi ý tại https://docs.python.org/2.7/USE/mac.html#getting-and-installing-macpython
Đối với tôi điều này có liên quan

sudo rm -rf /Library/Python

Sau đó, tôi đã xóa các liên kết tượng trưng và thực thi trong / usr / local / bin, chẳng hạn như

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*

vân vân Tôi cũng đã gỡ bỏ mọi ứng dụng

sudo rm -rf /Applications/Python\ 2.7/

Sau đó, tôi đã tải xuống gói cài đặt 2.7.13 cho Mac OS X từ https://www.python.org/doads/ và cài đặt nó.

Này được cài đặt một con trăn địa phương và pip tại /Library/Frameworks/Python.framework/Versions/2.7và liên kết tượng trưng trong /usr/local/binđó là tách biệt với các thư viện hệ thống tại /System/Library/Frameworks/Python.framework/usr/bin vì vậy mà tôi có được

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

và trong pip list

setuptools (28.8.0)
six (1.10.0)

ansible bây giờ làm việc cho tôi


1

Đối với tôi, việc PATHmất tích đã xảy ra pip, điều này đã được xác nhận bằng cách chạypython -m pip

Hai giải pháp tiềm năng ở đây, thêm piplại PATH. Trong trường hợp của tôi pipđã hết hạn, vì vậy nâng cấp đã sửa nó:

python -m pip install --upgrade pip

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.