Nâng cấp công cụ thiết lập trên OSX El Capitan


81

Tôi đang cố gắng nâng cấp các công cụ thiết lập. Thực ra tôi đang cố nâng cấp ansible nhưng nó đang cố nâng cấp các công cụ thiết lập và không thành công. Cố gắng bản thân cũng không thành công. Ngay cả khi cố gắng gỡ cài đặt nó cũng không thành công

$ sudo -H pip install --upgrade setuptools
Collecting setuptools
  Using cached setuptools-18.4-py2.py3-none-any.whl
Installing collected packages: setuptools
  Found existing installation: setuptools 1.1.6
    Uninstalling setuptools-1.1.6:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/basecommand.py", line 211, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/commands/install.py", line 311, in run
    root=options.root_path,
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/req/req_set.py", line 640, in install
    requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/req/req_install.py", line 716, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/req/req_uninstall.py", line 125, in remove
    renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/utils/__init__.py", line 315, in renames
    shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 299, in move
    copytree(src, real_dst, symlinks=True)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 208, in copytree
    raise Error, errors
Error: [('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.py', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.py', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.pyc', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.py', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.py', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.pyc', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib'")]

Tôi không biết điều gì là sai lầm nhất. Xem xét tất cả các tệp trong /System/Library/Frameworks/Python.framework/Versions/2.7/và bên dưới, mọi tệp đều thuộc quyền sở hữu củaroot:wheel

Làm thế nào tôi có thể sửa chữa nó?


2
Tôi không có giải pháp nhưng tôi có lời giải thích: có thể là do Bảo vệ toàn vẹn hệ thống mới . pip đang cố gắng sửa đổi những thứ mà nó không được phép nữa, ngay cả với sudo. Xem câu hỏi này . Tôi vẫn chưa dành thời gian để giải quyết việc này. Các --usertùy chọn để pip có lẽ là những gì tôi muốn nhìn vào. Nếu bạn tìm thấy một giải pháp thiết thực để "cập nhật" mọi thứ, hãy chia sẻ!
Arthur

Tôi đang gặp ipdblỗi được liên kết với setuptools. Nâng cấp công cụ thiết lập không hoạt động. Nó hoạt động với --user=pythonnhưng không khắc phục được lỗi ipdb vẫn còn.
R11G

Câu trả lời:


189

Điều này xảy ra do Bảo vệ toàn vẹn hệ thống được giới thiệu trong OS X El Capitan.

Thêm --user pythonvào lệnh cho phép điều này hoạt động.

Nói cách khác

pip install --upgrade setuptools --user python

2
pip(không giống như easy_install) không yêu cầu sudo, vì bạn đang cho phép nó sử dụng pythonngười dùng, tôi đảm bảo rằng nó hoạt động.
Kof

1
Cũng hoạt động trên CentOS 7 bên trong vùng chứa Docker. Đã không thành công vì một số lý do (mặc dù thiết lập tương tự đã hoạt động mà không có bước này trước tháng 5 năm 2016 ...)
geerlingguy

2
Tôi không thể làm cho nó hoạt động và tôi không hiểu tùy chọn --user hoạt động như thế nào. Điều phù hợp với tôi là tạm thời vô hiệu hóa Bảo vệ toàn vẹn hệ thống trong khi nâng cấp các công cụ thiết lập (liên quan đến cài đặt ipython) và sau đó bật lại nó sau đó. Để làm điều này: khởi động vào chế độ khôi phục (cmd + R), khởi chạy thiết bị đầu cuối và nhập csrutil disable. Khởi động lại và sau khi nâng cấp, hãy khởi động lại chế độ khôi phục và nhập csrutil enable. Sau khi khởi động lại, ipython tiếp tục hoạt động tốt đối với tôi.
Grav

Tôi có thể thực hiện lệnh này thành công, nhưng không có cập nhật nào được thực hiện. Các chàng đầu ra như thế này:Collecting setuptools Using cached setuptools-28.2.0-py2.py3-none-any.whl Requirement already up-to-date: python in /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload Installing collected packages: setuptools Successfully installed setuptools-1.1.6
diidu

Tôi đã cuối cùng có thể có được những điều làm việc bằng cách làm theo các hướng dẫn đưa ra ở đây: apple.stackexchange.com/questions/209572/...
diidu

2

Tổng quat

Vấn đề là các thư viện Python xung đột, kết hợp với Bảo vệ Toàn vẹn Hệ thống (SIP) trên Mac OS để bảo vệ các thư viện Python hệ thống.

Giải pháp tốt nhất theo ý kiến ​​của tôi là gỡ cài đặt và cài đặt lại cài đặt Python của riêng bạn và giữ riêng biệt với các thư viện Python do Mac OS cung cấp được bảo vệ bởi SIP.

Tôi ưu tiên điều này để tắt SIP vì tôi mong đợi SIP sẽ là một phần của bất kỳ bản phát hành Mac OS nào trong tương lai và SIP không phải là nguyên nhân ở đây, nó chỉ bộc lộ vấn đề xung đột thư viện Python.

Chi tiết

Tôi cũng gặp sự cố này khi cố gắng cài đặt ansible.

Sự cố của tôi bắt đầu xảy ra khi tôi làm theo hướng dẫn cài đặt an toàn cho Mac OS, đó là cài đặt qua pip và cài đặt bằng pip easy_installnhư được mô tả tại Bản phát hành mới nhất qua Pip

Vấn đề là khi cài đặt pip theo cách này, easy_installMac OS được cung cấp easy_installtại /usr/bin/easy_installnhưng nó ghi vào easy-install.pthtệp tại /Library/Python/2.7/site-packages/easy-install.pthvà tệp đó tham chiếu đến các thư viện Python do Mac OS cung cấp.

Sau đó, cài đặt ansible với pip install ansiblesau đó báo cáo rằng yêu cầu setuptools được đáp ứng bởi Mac OS Thư viện Python được cung cấp tại /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Ansible yêu cầu setuptools nhưng không chỉ định phiên bản. Một gói phụ thuộc khác, paramiko, yêu cầu setuptools> = 11.3, nhưng điều này dường như không được kiểm tra khi cài đặt ansible qua pip. Khi bạn cố gắng chạy ansible mặc dù nó phàn nàn rằng các công cụ thiết lập là 1.1.6 Đây là phiên bản setuptools được cung cấp với Mac OS và hiện được bảo vệ bởi SIP, vì vậy không thể nâng cấp nó.

Thay vì tắt SIP, tôi đã khắc phục sự cố này bằng cách gỡ cài đặt Python cục bộ của mình như được gợi ý tại https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython , sau đó tải xuống và cài đặt lại.

Nếu bạn lo lắng về rm, bạn có thể mv
để gỡ cài đặt, tôi đã làm

sudo rm -rf /Library/Python
sudo rm -rf /Applications/Python\ 2.7/
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*
# and so on for references to /Library/Python/2.7 in /usr/local/bin

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

Điều này đã cài đặt một python cục bộ và pip tại /Library/Frameworks/Python.framework/Versions/2.7và các liên kết tượng trưng /usr/local/bincũng như thêm vào /Library/Frameworks/Python.framework/Versions/2.7$ PATH của tôi. Điều này giúp mọi thứ tách biệt với các thư viện được cung cấp bởi Mac OS /System/Library/Frameworks/Python.framework/usr/bin để tôi nhận được

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

Sau đó, tôi đã cài đặt ansible với pip install ansible
Sau đó, khi tôi chạy, which ansibletôi nhận được

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

và trong pip list

setuptools (28.8.0)
six (1.10.0)

và ansible hiện hoạt động đối với tôi vì thư viện Python của Mac OS không được tham chiếu bởi cài đặt mới.

Lưu ý rằng do cài đặt trình cài đặt $ PATH, which pythonhiện đang /Library/Frameworks/Python.framework/Versions/2.7/bin/python/usr/local/bin/pythonlà một liên kết tượng trưng cho điều này.
Nếu bạn muốn hệ thống Python, bạn sẽ phải sử dụng / usr / bin / python hoặc thay đổi $ PATH


1

Câu trả lời là bạn không thể cập nhật các công cụ thiết lập trên OSX cho python nhà máy đi kèm với hệ điều hành. Nguyên nhân là do /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/pythonngười dùng không thể xóa hoặc sửa đổi các tệp trong đó . Không chỉ người dùng bình thường mà ngay cả khi bạn có quyền root, bạn sẽ không thể sửa đổi các tệp đó.

Chắc chắn bạn có thể sử dụng nhiều phương pháp khác nhau để cài đặt phiên bản mới hơn của setuptools nhưng điều này sẽ không ghi đè gói hệ thống mặc định. Có nghĩa là nếu bạn sử dụng --user pythoncờ theo lộ trình được đề xuất hoặc bạn chọn cài đặt chúng mà không cần root vào ~/Library, những điều này sẽ không ghi đè phiên bản tệp hệ thống.

Lý do bạn hoặc người chủ không thể sửa đổi mặc định của hệ thống là do các hạn chế về quyền SIP trong El Capitan +. Bạn có thể tắt SIP nhưng điều này thường không được khuyến khích.

Thay vào đó, giải pháp hợp lý duy nhất là sử dụng python virtualenv.

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.