이 문제는 pip가 El Capitan에 IPython 용 맨 페이지를 설치하려고 할 때 종종 발생합니다. 빠른 수정은 다음과 같은 pip 명령을 사용하는 것입니다.
sudo -H pip install --install-option '--install-data=/usr/local' <package>
그러나 El Capitan의 SIP (System Integrity Protection)는 pip를 사용하여 여러 가지 나쁜 사례를 차단하므로 El Capitan에서 pip를 원활하게 실행하려면 몇 가지 사항을 더 변경해야합니다.
El Capitan의 SIP는 OS가 제공하는 Apple에서 제공하는 Python 버전의 pip를 사용할 때 세 가지 문제가 발생합니다.
distutils는 Mac에서 두 가지 중요한 변수를 올바르게 설정하지 않으므로 pip는 아래에 헤더 및 기타 공유 파일 (예 : 맨 페이지)을 쓰려고합니다 /System/Library/Frameworks/Python.framework/Versions/2.7/
. 이것은 좋지 않은 생각이지만 이전 버전의 OS X에서는 pip가 sudo와 함께 실행되면 성공했습니다. 그러나 SIP로 인해 El Capitan에서 실패합니다. 이것이 발생한 오류입니다. 그것은 같은 메시지를 제공합니다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/
(예 : 6 개)을 설치합니다. 이전 버전의 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를 참조하십시오 .
Apple 버전의 Python 은 표준 사용자 액세스 패키지 설치 위치 위 의 /System/Library/Frameworks/Python.framework/Versions/2.7/
python 검색 경로에 여러 디렉토리를 추가합니다 . 따라서 다른 곳 (예 :)에 최신 버전의 패키지를 설치하면 설치에 성공했다는 메시지가 표시되지만 python을 실행하면에서 이전 버전을 가져옵니다 . 또한 표준 라이브러리의 모듈과 이름이 같은 새 패키지를 사용할 수 없습니다.sudo -H pip install --ignore-installed six
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
이러한 문제를 해결할 수 있지만 방법은 세 가지 질문에 대한 답변에 따라 다릅니다.
- Mac OS X 버전의 Python을 계속 사용하거나 직접 설치 하시겠습니까? 직접 설치하는 것이 가장 안전한 옵션이며 공식 Python 설치 프로그램, Homebrew 또는 Anaconda를 통해 수행 할 수 있습니다. @Sacrilicious가 지적한 바와 같이, 애플이 권장하는 것도 이것이다 . 자체 버전의 Python을 설치하는 경우 현재 설치된 모든 항목과 해당 패키지에 설치된 스크립트 (pip 포함)를 제거해야합니다. 그렇지 않으면 시스템에 설치된 Python 버전에 액세스하는 스크립트와 자체 설치에 액세스하는 일부 스크립트에 대한 성가신 경험이 있습니다.
/Library/Python/2.7/site-packages
/usr/local/bin
시스템에 설치된 Python을 고수하려면 두 가지 결정을 더 내려야합니다.
모든 사용자 또는 자신을 위해 패키지를 설치 하시겠습니까? 모든 사용자를 위해 설치하면 관리 스크립트를 포함하여 Python을 사용하는 모든 프로그램이 설치 한 모든 패키지에 액세스 할 수 있습니다. 그러나 El Capitan의 자체 Python 사용을 방해 할 가능성은 먼 것입니다. (애플이 python -S
항상 원하는 패키지를 얻을 수 있기를 희망 하지만 테스트 할 방법이 없다.) 자신의 사용자 계정으로 만 설치하면 시스템 파이썬 설치를 방해 할 가능성이 없다. 참고 : 시스템 전체 설치에서 사용자 전용으로 전환하려는 경우 현재 설치된 /Library/Python/2.7/site-packages
스크립트 및 관련 스크립트 를 모두 제거 할 수 있습니다 /usr/local/bin
.
OS X 버전의 Python (아래 /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
) 과 함께 설치된 추가 패키지를 숨기 거나 검색 경로에 유지 하시겠습니까? 이 패키지의 최신 버전이 필요할 때 사용자가 액세스 할 수있는 위치에 자동으로 설치되도록 숨길 것을 권장합니다. 이 디렉토리를 숨기지 않으면 pip에서 기존 패키지를 제거 할 수 없다는 메시지가 표시되는 경우가 있습니다 (설치중인 다른 패키지가 필요함). 이 경우 pip install --ignore-installed <package>
새 버전을 설치하고 시스템 설치 버전을 숨기려면를 실행해야합니다 . 그러나 전체를 숨기면/System/.../Extras/...
pip를 통해 사용할 수없는 일부 Apple 패키지 (예 : CoreGraphics 및 bonjour)에 대한 액세스 권한이 손실됩니다. (필요한 경우 사이트 패키지 디렉토리로 심볼릭 링크하여 액세스 할 수 있습니다.)
이제 해결 방법이 있습니다. 운영 체제에서 사용하는 Python 패키지를 실수로 교체하거나 제거하지 않으려면 모든 버전의 OS X에서이 방법을 사용하는 것이 좋습니다. 그러나 OS X El Capitan (10.11)에서 Apple이 제공하는 Python 버전의 사용자 설치 패키지를 사용하려면 필수입니다.
핍 설치
이미이 작업을 수행했을 수도 있지만 그렇지 않은 경우 다음 명령을 사용하여 모든 사용자에 대해 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
공유 파일 위치 관리
모든 사용자를위한 패키지를 설치하는 경우 https://github.com/pypa/pip/issues/426 에서 다음 행을 사용하여 .pydistutils.cfg 파일을 작성 하십시오 .
[install]
install-data=/usr/local
install-headers=/usr/local
일반적으로을 사용하는 sudo -H pip ...
경우이 파일을 /var/root
(루트 사용자의 홈 디렉토리)에 두어야합니다 . 일반적으로을 사용하는 sudo pip ...
경우이 파일을 자신의 홈 디렉토리 (~)에 두어야합니다.
이 설정은 pip가 아래의 헤더 및 맨 페이지와 같은 공유 항목을 쓰지 못하게 /Library/System
합니다. (이 답변의 맨 위에있는 명령은 동일한 버전의 빠른 버전입니다.)이 설정은 darwin 관련 코드 입력에서 /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의 검색 순서에서 더 높은지 확인해야합니다. 가장 쉬운 방법은 .pth
파일을 사용하는 것입니다. 이것은 이 페이지의 다른 곳에서 @Sacrilicious의 제안을 따르지만 사용자 사이트 패키지 디렉토리는 시스템 전체 사이트 패키지 디렉토리보다 먼저 검색되고 표준 라이브러리와 Apple의 Extras 디렉토리 (둘 다 / System / 아래)에서 모두 검색됩니다. ..). /System/.../Extras
원하는 경우 검색 경로에서 생략 됩니다.
fix_mac_path.pth
아래 텍스트로 이라는 파일을 만듭니다 . 모든 사용자를위한 패키지를 설치하는 경우에 fix_mac_path.pth
배치해야합니다 /Library/Python/2.7/site-packages
. 자신의 사용자만을 위해 설치하는 경우 fix_mac_path.pth
~ / Library / Python / 2.7 / lib / python / site-packages에 있어야합니다. (이 파일은 원하는 이름을 가질 수 있지만이 위치 중 하나 또는 둘 모두에 위치해야하며이 .pth
파일의 모든 텍스트는 한 줄에 있어야합니다.)
다음에 Apple 설치 패키지를 숨기려면 다음을 수행하십시오 /System/.../Extras
.
먼저 다음 명령 중 하나를 실행하여 Apple 제공 버전과 독립적으로 pip / setuptools의 작업 사본을 얻으십시오.
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>