この問題は、pipがEl CapitanにIPythonのマンページをインストールしようとしたときによく発生します。簡単な修正方法は、次のようなpipコマンドを使用することです。
sudo -H pip install --install-option '--install-data=/usr/local' <package>
ただし、El Capitanのシステム整合性保護(SIP)は、スライドに使用されるpipのいくつかの悪い習慣をブロックします。
El CapitanのSIPは、OS XでAppleが提供するバージョンのPythonでpipを使用する際の3つの問題を明らかにします。
distutilsはMac上で2つの重要な変数を正しく設定しないため、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/
これらの問題を回避できますが、方法は3つの質問に対する答えに依存します。
- Mac OS XバージョンのPythonを引き続き使用しますか、それとも独自のPythonをインストールしますか?独自のインストールが最も安全なオプションであり、公式のPythonインストーラーであるHomebrewまたはAnacondaを使用して実行できます。@Sacriliciousが指摘したように、これはAppleが推奨するものでもあります。独自のバージョンのPythonをインストールする場合、おそらく現在インストールされているものと、それらのパッケージ(pipを含む)にインストールされたスクリプトをすべてアンインストールする必要があります。そうしないと、システムにインストールされたバージョンのPythonにアクセスするスクリプトや、独自のインストールにアクセスするスクリプトの迷惑な経験があります。
/Library/Python/2.7/site-packages
/usr/local/bin
システムにインストールされたPythonに固執したい場合は、さらに2つの決定を行う必要があります。
すべてのユーザー用にパッケージをインストールしますか、それとも自分用にパッケージをインストールしますか?すべてのユーザーにインストールすると、Pythonを使用するすべてのプログラム(おそらく管理スクリプトを含む)が、インストールするすべてのパッケージにアクセスできるようになります。ただし、El CapitanのPythonの使用を妨げる可能性は遠いです。(Appleがpython -S
期待どおりのパッケージを常に入手できるようにするために使用することを望んでいますが、これをテストする方法はありません。)自分のユーザーアカウントだけにインストールすると、システムのPythonインストールを妨げる可能性がなくなります。注:システム全体のインストールからユーザーのみのインストールに切り替える場合は、おそらくこの機会に、現在インストールされているすべての/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/...
ディレクトリを使用すると、Core Graphicsおよびbonjourなど、pipを介して利用できない一部のAppleパッケージにアクセスできなくなります。(これらが必要な場合は、サイトパッケージディレクトリにシンボリックリンクすることでアクセスできる場合があります。)
さて、ここに回避策があります。これらは、オペレーティングシステムで使用されるPythonパッケージを誤って置き換えたり削除したりしないように、OS Xのすべてのバージョンで有効な方法です。ただし、OS X El Capitan(10.11)でAppleが提供するバージョンのPythonでユーザーがインストールしたパッケージを使用する場合、これらは不可欠です。
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
(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パスを管理する
インストールするパッケージが、システムにインストールされたパッケージよりも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
;である必要があります。また、このファイルのすべてのテキストは1行である必要があります。)
で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>