私が使用しているサーバーの管理者は、Pythonモジュールを非常に古く残す傾向があり、この人がグローバルディレクトリを更新するのを待つ時間がないことがわかりました。モジュールをPython標準ライブラリからローカルディレクトリにインストールする標準的な方法は何ですか?
sys.pathを手動で変更することなく、ローカルのPythonモジュールをグローバルライブラリよりも優先させる方法はありますか?
私が使用しているサーバーの管理者は、Pythonモジュールを非常に古く残す傾向があり、この人がグローバルディレクトリを更新するのを待つ時間がないことがわかりました。モジュールをPython標準ライブラリからローカルディレクトリにインストールする標準的な方法は何ですか?
sys.pathを手動で変更することなく、ローカルのPythonモジュールをグローバルライブラリよりも優先させる方法はありますか?
さまざまなオプションがあります。 Python 2.6以降を使用している場合は、PythonのDistutilsでサポートされているuser installation schemeを使用して、ホームディレクトリにPythonモジュールをインストールできます。リンクに記載されているように、setup.py install
コマンドに--user
を追加するだけです。別の一般的なオプションは、サードパーティのvirtualenv
パッケージを使用して、1つ以上の独立したローカルPython環境を作成することです。
更新:user installation scheme
の場合、ユーザーのsite-packagesディレクトリのチェックはPythonの起動時に行われます。ディレクトリが存在する場合は、system site-packagesディレクトリの前にsys.path
に追加されます。たとえば、Debian Linuxをインストールした場合:
$ python2.7 -c 'import site; print(site.USER_SITE)'
/home/nad/.local/lib/python2.7/site-packages
$ ls -l /home/nad/.local/lib/python2.7/site-packages
ls: cannot access /home/nad/.local/lib/python2.7/site-packages: No such file or directory
$ python2.7 -c 'import sys; print(sys.path)'
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7']
# user site-packages dir doesn't exist so it's not in sys.path
$ mkdir -p ~/.local/lib/python2.7/site-packages
$ python2.7 -c 'import sys; print(sys.path)'
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/home/nad/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7']
# now user site-packages dir exists so it is in sys.path and before /usr/lib ones
しかし、これは既にシステム上にある同じ古いグローバルパッケージよりも優先されますか? –
@Nedによって与えられたリンクを読むと、それは 'userbase'を使ってそのモジュールをインストールしますので、システムのデフォルトモジュールを上書きしません。モジュールをインポートすると、 'userbase'のlibの' python'ディレクトリをチェックし、 'python'ディレクトリのシステムをチェックします。 – Nilesh
いずれの方法でも、 'sys'モジュールで' sys.path'として利用可能なPythonの検索順序を使用して、ユーザディレクトリが最初に検索されるようにします。 –