OSX El Capitan: sudo pip cài đặt OSError: [Errno: 1] Thao tác không được phép


127

Khi tôi chạy:

sudo pip install ipython

Tôi nhận được lỗi sau đây

OSErrour

Lệnh cuối cùng được thực hiện cố gắng tạo thư mục được đưa ra ở trên.

Ngoài ra, lệnh sau không cài đặt iPython mà không cung cấp bất kỳ lỗi nào.

sudo pip install --user python

(Tôi đang dùng Mac OS X El Capitan trong trường hợp những người khác trên HĐH này gặp vấn đề tương tự.)



Tôi đã thêm một câu trả lời giải thích cách sửa đổi của bạn $PATHđể bạn có thể gọi các tệp thực thi cho các gói --user được cài đặt. stackoverflow.com/a/47102398/117471
Bruno Bronosky

2
Bạn không nên sử dụng sudovới --user. Những gì --userkhông được cài đặt vào ~/Librarychứ không phải /LibraryBạn không phải sử dụng sudođể cài đặt ở đó. Nhưng một khi bạn cài đặt sudo, các thư mục và tập tin đều thuộc sở hữu của root. Sau đó, bạn phải sử dụng sudođể làm bất cứ điều gì khác với họ. Đến lượt nó sẽ yêu cầu bạn sử dụng sudocho những thứ khác mà bạn không nên sử dụng nó cho. Sau đó, ngay cả một sai lầm trung thực cũng có thể đi từ ném lỗi, đến phá hủy dữ liệu.
Bruno Bronosky

Câu trả lời:


205

Hướng dẫn nói sudo pip installvốn đã sai.

Nếu có bất kỳ hướng dẫn nào ngoài đó nói rằng bạn nên làm sudo pipthì xin vui lòng gửi một lỗi đối với gói này. Tác giả đang giáo dục cộng đồng Python, vì thời gian đã được chứng minh sudo piplà một thực tiễn bị phá vỡ.

OSX El Capitan đã giới thiệu một cơ chế để ngăn chặn làm hỏng các tệp hệ điều hành . /System/Library/Frameworks/Python.framework/Versions/2.7/sharelà một trong những địa điểm được bảo vệ Một người dùng bình thường không có lý do để đặt hoặc ghi bất kỳ tập tin nào ở đó . Điều này là do bản thân hệ điều hành phụ thuộc vào các tệp này và sudo pip, với tất cả các lực được đưa ra từ trên, sẽ ghi đè lên chúng một cách vô điều kiện. Thông thường những điều xấu sẽ không xảy ra, nhưng cơ hội là có. Apple muốn bảo vệ người dùng hệ điều hành của họ vô tình gạch cài đặt của họ.

Thay vào đó, bạn cần cài đặt gói Python, như IPython, cục bộ vào thư mục chính của người dùng . Cách dễ nhất là tạo một môi trường ảo , kích hoạt nó và sau đó chạy pip trong môi trường ảo.

Thí dụ:

cd ~  # Go to home directory
virtualenv my-venv
source my-venv/bin/activate
pip install IPython

Thêm thông tin

Ngoài ra, một người sẽ có thể làm pip install --user. Nhưng một lần nữa, không cần sudo và bạn cần thiết lập thủ công PATHbiến môi trường.


5
Nếu không có virtualenv là mong muốn và bạn muốn trên toàn thế giới (ví dụ /Library/Python/2.7/site-packages) cài đặt mô-đun, cố gắng giải pháp của tôi dưới đây sử dụng easy_install stackoverflow.com/a/33463702/3078330
smat88dd

3
Bạn có một trích dẫn cho quan điểm này về 'sudo pip' là xấu ("như thời gian đã chứng minh sudo pip là một thực tiễn bị hỏng")? Tôi không thấy bất kỳ cuộc thảo luận nào về sudo trong các trích dẫn bạn đưa ra và hướng dẫn liệt kê bước đầu tiên để tạo virtualenv là 'pip install virtualenv' dường như tạo ra sự phụ thuộc vòng tròn cố gắng làm theo lời khuyên của bạn.
Von

1
@Von: pip install virtualenvkhông còn cần thiết cho Python 3.4+, vì chúng đi kèm với python -m venvtương đương virtualenv tích hợp. docs.python.org/3/library/venv.html
Mikko Ohtamaa

29
Với tất cả sự tôn trọng, điều đó không giải quyết được câu hỏi ban đầu. Tôi đang cố gắng cài đặt IPython và cung cấp nó trên toàn cầu (cho tất cả người dùng trên máy của tôi), và cả virtualenv cũng không pip install --user IPythongiúp được gì. Hơn nữa, pip install --user IPythonkhông đặt ipythonlệnh trong $PATH(ít nhất là trên máy của tôi).
jpetazzo

3
Bạn đã dạy tôi và cũng tiết kiệm thời gian của tôi. Cảm ơn rất nhiều Tôi đã ngừng sử dụng sudo và mọi thứ đã hoạt động! Câu trả lời chính xác.
Parth Gupta

24

Tôi đã có những vấn đề tương tự, nhưng sử dụng easy_install "module"giải quyết vấn đề cho tôi.

Tôi không chắc tại sao, nhưng pip và easy_install sử dụng các vị trí cài đặt khác nhau và easy_install đã chọn đúng vị trí.

Chỉnh sửa: không kiểm tra lại nhưng vì các bình luận; có vẻ như các cài đặt khác nhau (OSX và cài đặt bia) giao thoa với nhau, đó là lý do tại sao các công cụ được đề cập thực sự chỉ đến các vị trí khác nhau (vì chúng thuộc về các cài đặt khác nhau). Tôi hiểu rằng thường là những công cụ từ một điểm cài đặt đến cùng một thư mục.


Bạn có cài đặt hai trình thông dịch Python khác nhau và easy_installđược cấu hình cho một trình thông dịch khác không?
Mikko Ohtamaa

Tôi làm có 2-3 phiên bản python khác nhau được cài đặt, nhưng tôi có easy_installcho tất cả trong số họ: easy_install-2.6, easy_install-2.7,easy_install-3.5
smat88dd

Rất có thể pipeasy_installtrỏ đến các Python khác nhau. Bạn có thể tìm ra điều này với whichlệnh UNIX sau đó tìm ra piplệnh phải sử dụng.
Mikko Ohtamaa

1
Có thể được cài đặt trước từ OSX cũ trước khi nâng cấp?
Mikko Ohtamaa

1
pip và easy_install sử dụng các vị trí cài đặt khác nhau - không, chúng sử dụng cùng một vị trí. Nó hoạt động một cách tình cờ khi @MikkoOhtamaa đang cố gắng cho bạn thấy trong những bình luận của anh ấy. Điều này rõ ràng là không trả lời.
Piotr Dobrogost

19

Bạn nên cài đặt lại Python:

brew reinstall python

Để có được bia hãy xem trang chủ của bia .


Tôi thứ hai. Tôi chạy brew install pythonsau đó tôi nghĩ piplà đã có. Sau khi pipcài đặt đó hoạt động (tôi gặp vấn đề tương tự với quyền và bẻ khóa khi cài đặt)
travelling

15

pip install --ignore-installed six

Điều này sẽ thực hiện công việc, sau đó bạn có thể thử lệnh đầu tiên của bạn.

Qua http://github.com/pypa/pip/issues/3165


Trong trường hợp của tôi, tôi cũng phải làm pip install --ignore-installed setuptools.
ithos67

2
Không, điều này sẽ không thực hiện công việc vì thiếu quyền.
Piotr Dobrogost

11

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


10
FYI, điều này hoạt động vì pip3sử dụng Python 3, thường được cài đặt bởi người dùng. Python 2 (2.7), mặt khác, được vận chuyển bằng macOS và được bảo vệ như câu trả lời được xếp hạng hàng đầu giải thích.
Khánh Nguyễn

10

Sửa chữa TL; DR $ PATH

  1. Sử dụng pip install --user package_nameđể cài đặt một gói nên bao gồm các tệp thực thi CLI.
  2. Khởi động một lớp vỏ trăn và import package_name
  3. Tìm nơi lib/python/...xảy ra trong đầu ra và thay thế tất cả bằngbin
  4. Nó có khả năng là $HOME/Library/Python/2.7/bin

Chi tiết

Do Bảo vệ toàn vẹn hệ thống mới trong macOS 10.11 El Capitan, bạn không còn có thể sudo pip install. Chúng tôi sẽ không tranh luận về giá trị của điều đó ở đây.

Một câu trả lời khác giải thích rằng bạn nên pip install --userđúng. Nhưng họ đã gửi bạn đến các con hẻm phía sau để tìm hiểu phải làm gì về bạn $PATHđể bạn có thể truy cập vào các tệp thực thi được cài đặt. May mắn thay, tôi đã giải quyết một nhu cầu tương tự cho một câu hỏi không liên quan .

Đây là bảng điểm về cách tôi giải quyết vấn đề trên một trong các hệ thống của mình. Tôi bao gồm tất cả thay vì chỉ $PATHhoạt động cho tôi, bởi vì hệ thống của bạn có thể khác với tôi. Quá trình này sẽ làm việc cho tất cả mọi người.

$ pip install --user jp
Collecting jp
  Downloading jp-0.2.4.tar.gz
Installing collected packages: jp
  Running setup.py install for jp ... done
Successfully installed jp-0.2.4

$ python -c 'import jp; print jp'
<module 'jp' from '/Users/bbronosky/Library/Python/2.7/lib/python/site-packages/jp/__init__.pyc'>

$ find /Users/bbronosky/Library/Python -type f -perm -100
/Users/bbronosky/Library/Python/2.7/bin/jp

$ which jp

$ echo -e '\n''export PATH=$HOME/Library/Python/2.7/bin:$PATH' >> ~/.bashrc

$ bash # starting a new bash process for demo, but you should open a new terminal

$ which jp
/Users/bbronosky/Library/Python/2.7/bin/jp

$ jp
usage: jp <expression> <filepath>

10

Lỗi tương tự

Installing collected packages: six, pyparsing, packaging, appdirs, setuptools
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/commands/install.py", line 342, in run
    prefix=options.prefix_path,
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_set.py", line 784, in install
    **kwargs
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_install.py", line 851, in install
    self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_install.py", line 1064, in move_wheel_files
    isolated=self.isolated,
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/wheel.py", line 345, in move_wheel_files
    clobber(source, lib_dir, True)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/wheel.py", line 323, in clobber
    shutil.copyfile(srcfile, destfile)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 83, in copyfile
    with open(dst, 'wb') as fdst:
IOError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/six.py'

và ở đây tôi sử dụng --usermà không cần sudogiải quyết vấn đề này

$ pip install --user scikit-image h5py keras pygame
Collecting scikit-image
  Downloading http://mirrors.aliyun.com/pypi/packages/65/69/27a1d55ce8f77c8ac757938707105b1070ff4f2ae47d2dc99461bfae4491/scikit_image-0.13.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (28.1MB)
    100% |████████████████████████████████| 28.1MB 380kB/s
Collecting h5py
  Downloading http://mirrors.aliyun.com/pypi/packages/b7/cc/1c29b0815b12de2c92b5323cad60f724ac8f0e39d0166d0b9dfacbcb70dd/h5py-2.7.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (4.5MB)
    100% |████████████████████████████████| 4.5MB 503kB/s
Requirement already satisfied: keras in /Library/Python/2.7/site-packages
Requirement already satisfied: pygame in /Library/Python/2.7/site-packages
Requirement already satisfied: matplotlib>=1.3.1 in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from scikit-image)
Requirement already satisfied: six>=1.7.3 in /Library/Python/2.7/site-packages (from scikit-image)
Requirement already satisfied: pillow>=2.1.0 in /Library/Python/2.7/site-packages (from scikit-image)
Requirement already satisfied: networkx>=1.8 in /Library/Python/2.7/site-packages (from scikit-image)
Requirement already satisfied: PyWavelets>=0.4.0 in /Library/Python/2.7/site-packages (from scikit-image)
Collecting scipy>=0.17.0 (from scikit-image)
  Downloading http://mirrors.aliyun.com/pypi/packages/72/eb/d398b9f63ee936575edc62520477d6c2353ed013bacd656bd0c8bc1d0fa7/scipy-0.19.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (16.2MB)
    100% |████████████████████████████████| 16.2MB 990kB/s
Requirement already satisfied: numpy>=1.7 in /Library/Python/2.7/site-packages (from h5py)
Requirement already satisfied: theano in /Library/Python/2.7/site-packages (from keras)
Requirement already satisfied: pyyaml in /Library/Python/2.7/site-packages (from keras)
Requirement already satisfied: python-dateutil in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: tornado in /Library/Python/2.7/site-packages (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: pyparsing>=1.5.6 in /Users/qiuwei/Library/Python/2.7/lib/python/site-packages (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: nose in /Library/Python/2.7/site-packages (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: olefile in /Library/Python/2.7/site-packages (from pillow>=2.1.0->scikit-image)
Requirement already satisfied: decorator>=3.4.0 in /Library/Python/2.7/site-packages (from networkx>=1.8->scikit-image)
Requirement already satisfied: singledispatch in /Library/Python/2.7/site-packages (from tornado->matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: certifi in /Library/Python/2.7/site-packages (from tornado->matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: backports_abc>=0.4 in /Library/Python/2.7/site-packages (from tornado->matplotlib>=1.3.1->scikit-image)
Installing collected packages: scipy, scikit-image, h5py
Successfully installed h5py-2.7.0 scikit-image-0.13.0 scipy-0.19.0 

Hy vọng nó sẽ giúp một người gặp phải vấn đề tương tự!


3
Bạn không nên sử dụng sudovới --user. Những gì --userkhông được cài đặt vào ~/Librarychứ không phải /LibraryBạn không phải sử dụng sudođể cài đặt ở đó. Nhưng một khi bạn cài đặt sudo, các thư mục và tập tin đều thuộc sở hữu của root. Sau đó, bạn phải sử dụng sudođể làm bất cứ điều gì khác với họ. Đến lượt nó sẽ yêu cầu bạn sử dụng sudocho những thứ khác mà bạn không nên sử dụng nó cho. Sau đó, ngay cả một sai lầm trung thực cũng có thể đi từ ném lỗi, đến phá hủy dữ liệu.
Bruno Bronosky

9

Tôi đã có những vấn đề tương tự. Như những người khác đã đề cập, không chạy cài đặt pip với sudo. Chạy

brew doctor 

và sửa các cảnh báo và bạn sẽ có thể tiến hành cài đặt pip.


6

Thật khó để khiến pip hoạt động trên El Capitan vì một số lý do:

  1. OS X không đặt chính xác một số biến distutils, vì vậy pip cố gắng cài đặt các tệp phụ trợ ở các vị trí bên dưới /System/Library/. El Capitan chặn điều này, đó là lỗi bạn đang gặp phải.
  2. OS X bao gồm một số gói lỗi thời /System/Library/. Pip thường muốn nâng cấp những thứ này nhưng không thể trên El Capitan.
  3. OS X đặt /System/Library/thứ tự tìm kiếm python cao hơn /Library/Python/2.7/site-packages(vị trí gói python toàn hệ thống), vì vậy ngay cả khi bạn quản lý để cài đặt các phiên bản mới hơn của một số gói, các gói cũ vẫn được tải, phá vỡ một số phụ thuộc.

Có cách giải quyết cho tất cả những điều này tại https://apple.stackexchange.com/a/223163/143849 . Nhưng tốt nhất bạn nên cài đặt phiên bản Python của riêng mình thông qua trình cài đặt Python tiêu chuẩn, Homebrew hoặc Anaconda.


4

Tôi đoán bạn có một số xung đột với gói khác. Đối với tôi đó là six. Vì vậy, bạn cần sử dụng một lệnh như thế này:

pip install google-api-python-client --upgrade --ignore-installed six

hoặc là

pip install --ignore-installed six


3
Phần nào của câu trả lời được đưa ra bởi @MikkoOhtamaa bạn không hiểu rằng bạn vẫn đề xuất sử dụng sudo với pip ?
Piotr Dobrogost

@PiotrDobrogost, tại sao bạn không đọc đúng trước khi hỏi. Câu trả lời của tôi là liên quan six.
Ruhul Amin

3
Một lần nữa, phần nào của câu trả lời được đưa ra bởi @MikkoOhtamaa bạn không hiểu rằng bạn vẫn đề nghị sử dụng sudo với pip ?
Piotr Dobrogost

1

Tôi hoàn toàn đồng ý với Mikko, nhưng nếu bạn vẫn muốn làm điều đó, đây là cách:

  • Khởi động lại trong chế độ phục hồi (Giữ cmd + R)
  • Mở thiết bị đầu cuối từ các tiện ích
  • Sử dụng lệnh csrutil disable

6
Đây có thể là lời khuyên nguy hiểm mà không giải thích ý nghĩa của việc vô hiệu hóa Bảo vệ toàn vẹn hệ thống. Một điều cần cân nhắc là kỳ vọng rằng nó sẽ không bao giờ hoạt động bình thường trở lại nếu bạn không kích hoạt lại nó tương đối nhanh, giống như Windows UAC và Virtualization.
andy magoon

0

Tôi đã cài đặt python2.7 qua brew và sau đây đã giải quyết vấn đề của tôi

bia cài đặt numpy

Nó cài đặt python3, nhưng nó vẫn hoạt động và thiết lập cho 2.7.


Làm việc hoàn hảo. Cảm ơn!!
NightFury
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.