web-dev-qa-db-ja.com

Python:インストールされている複数のモジュールバージョンのいずれかを選択します

私のシステムでは、複数のモジュールを複数回インストールしています。例として、numpy 1.6.1/usr/lib/python2.7/dist-packagesの標準パスにインストールされており、numpy 1.8.0のアップデートバージョンが/local/python/lib/python2.7/site-packages/にインストールされています。

古いバージョンを簡単に削除できないのは、仕事用のコンピューターで何かを変更する権限がないためです。ただし、新しいnumpyバージョンを使用する必要があります。

PYTHONPATH/local/python/lib/python2.7/site-packages/を追加しました。残念ながら、これは役に立ちません。/usr/lib/python2.7/dist-packagesが最初にパスに挿入されるため、numpy 1.6.1がロードされます。次に例を示します。

>>> import os
>>> print os.environ['PYTHONPATH']
/local/python/lib/python2.7/site-packages
>>> import pprint
>>> import sys
>>> pprint.pprint(sys.path)
['',
 '/local/python/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-linux-x86_64.Egg',
 '/local/python/lib/python2.7/site-packages/pyparsing-2.0.1-py2.7.Egg',
 '~/.local/lib/python2.7/site-packages/setuptools-3.4.4-py2.7.Egg',
 '~/.local/lib/python2.7/site-packages/mpldatacursor-0.5_dev-py2.7.Egg',
 '/usr/lib/python2.7/dist-packages',
 '/local/python/lib/python2.7/site-packages',
 '/usr/lib/python2.7',
 ...,
 '~/.local/lib/python2.7/dist-packages', 
 ...]

だから、輸入注文は

  1. カレントディレクトリ
  2. PYTHONPATHの卵
  3. ローカルモジュールパスからの卵(~/.local/lib/python2.7/site-packages/*.Egg
  4. システム全体のモジュールパス(~/usr/lib/python2.7/dist-packages/
  5. PYTHONPATHのディレクトリ
  6. 中間パス(簡潔にするために省略)
  7. ユーザーベースディレクトリ(~/.local/lib/python2.7/site-packages/

私の問題は、コードを正しく機能させるために、アイテム5をアイテム3と4の前に置く必要があることです。現在、numpy 1.8.0ディレクトリから/local/*に対してコンパイルされたモジュールをインポートした場合、このモジュールがnumpyをインポートしても、/usr/*ディレクトリからnumpyを取得して失敗します。

スクリプトに次のようなものを配置することで、この問題を回避しました。

import sys
sys.path.insert(0, '/local/python/lib/python2.7/site-packages/')

これにより、Pythonに正しいインポート順序を使用するように強制できますが、これは解決策ではありません。これはすべての単一スクリプトで行う必要があるためです。

27
Jenny

コメントセクションですでに与えられた提案に加えて、あなたは virtualenv の使用について考えましたか?これにより、使用するすべてのモジュールをきめ細かく制御できます。 virtualenvに慣れていない場合は、ドキュメントを読んで、それがどのように機能するかを感じてください。

純粋に、たとえば、次のようにインストールして設定できます(virtualenv-1.11.6 looks 現在の最新バージョンになる):

$ curl -O https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.11.6.tar.gz
$ tar xvfz virtualenv-1.11.6.tar.gz
$ cd virtualenv-1.11.6
$ python virtualenv.py ../numpyvenv
$ cd ../numpyvenv
$ source ./bin/activate
(numpyvenv) $ pip install numpy
# downloads, compiles, and installs numpy into the virtual environemnt
(numpyvenv) $ python
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numpy.version.version
'1.9.1'
>>> quit()
(numpyvenv) $ deactivate
$ # the virtual environment has been deactivated

上記では、「numpyvenv」という名前の仮想環境を作成し、環境をアクティブ化し、numpyをインストールし、numpyバージョンを出力し(機能することを示すため)、pythonを終了し、環境を非アクティブ化しました。次に環境をアクティブ化するとき、numpyは、インストールする他のモジュールと一緒に存在します。これを試みている間にしゃっくりに遭遇するかもしれませんが、それはあなたを始めるはずです。

8
rkersh

管理者アクセスなしで使用していたMacでこの問題が発生しました。私の解決策は次のとおりでした:

  1. 使用したいnumpyバージョンのディレクトリを見つけます。私にとってこれは_/Library/Python/2.7/site-packages_でした

  2. ファイル_~/.startup.py_を作成し、.bashrcファイルで_PYTHONSTARTUP=~/.startup.py_を使用してポイントします

  3. _.startup.py_内:

_import sys_

sys.path.insert(0,'/Library/Python/2.7/site-packages/') <---これを標準部品の前にインポートします

_import numpy_

print("Importing numpy version"+numpy.__version__) <---- numpyバージョンが変更されたことを思い出させるため

これは私にとってはうまくいくようです。お役に立てば幸いです。

3
Nick Walkden

Virtualenvは進むべき道のようですが、 Force python to my old version of module(thanks my what installed what)) のように、修正を使用することもできますの

import pkg_resources
pkg_resources.require("Twisted==8.2.0")
import twisted
2
serv-inc

Easy_installで最新のnumpyモジュールをインストールした後、Debian Wheezyでも同じ問題が発生しました。

古いモジュールが/usr/local/lib/python2.7/dist-packages/numpyにあったのに対して、新しいnumpyモジュールは/usr/lib/pymodules/python2.7/numpyにインストールされました。 numpyモジュールをインポートしようとすると、古いバージョンがインポートされました。そして、あなたが言うように、新しいモジュールパスをPYTHONPATHに追加しても、古いエントリの下のsys.pathに追加されるため、役に立ちません。

ローカルモジュールの前に/usr/lib/pymodules/python2.7をインポートするファイルeasy-installを作成するため、問題はeasy-install.pthにあるようです。

問題を修正するには私はただ編集ファイルを編集した/usr/local/lib/python2.7/dist-packages/easy-install.pthとコメント行を削除した/usr/lib/pymodules/python2.7したがって、この行はsys.pathの下に配置されます。

1
Pedro Piter