web-dev-qa-db-ja.com

virtualenvにUbuntuでdist-packagesを使用させる方法は?

Virtualenvは、新しい仮想環境を作成するときに--no-site-packages引数が渡されない場合、/usr/local/lib/python2.7/site-packages(Python 2.7)の場合)のパッケージを新しく-作成された仮想環境。Ubuntu12.04LTSには、Python 2.7パッケージをインストールできる3つの場所があります(デフォルトのUbuntu提供のPython 2.7インストールを使用) :

  1. /usr/lib/python2.7/dist-packages:これには、ipython、scipy、numpy、matplotlibのグローバルインストールが含まれています。これらのパッケージは、 scipyスタック
  2. /usr/local/lib/python2.7/site-packages:これは空です。ソースからパッケージをインストールしない限り、Ubuntuではそのままであると思います。
  3. /usr/local/lib/python2.7/dist-packages:これには、天文学にとって非常に重要なローカルパッケージ、特にPyRAF、STScIなどに関連するパッケージがあり、個別にインストールするのは非常に難しく、時間がかかります。

/usr/lib/python2.7/site-packagesなどのグローバルディレクトリがシステムに存在しないことに注意してください。また、ipython、scipyなどをグローバルにインストールすると、仮想環境をソース/アクティブ化することなく、これらのパッケージをオンザフライで使用できることにも注意してください。毎回。

当然のことながら、virtualenvを使用して、ユーザーのホームディレクトリに1つの仮想環境を作成し、将来のプロジェクトのためにソース/アクティブ化します。ただし、この仮想環境を作成するときに、上記のリストの場所(1)と(3)にあるすべてのパッケージをリンク/コピーしたいと思います。これの主な理由は、ipython、scipy、astro-packagesなどを再インストールするためにpip installプロセス(可能であれば)を実行したくないということです(そしておそらく他の)仮想環境。

これが私の質問です:

  1. 将来作成される仮想環境のこれら2つのdist-packagesディレクトリ内のパッケージをリンク/コピーするようにvirtualenvに指定する方法はありますか?
  2. 最終的に2つのdist-packagesディレクトリにあるscipy、ipythonなどのグローバルインストールを更新すると、仮想環境が使用する(およびvirtualenvの作成中に最初に取得した)パッケージも更新/変更されますか?
  3. Ubuntuにソースからパッケージをインストールした場合、それは/usr/local/lib/python2.7/dist-packagesまたは/usr/local/lib/python2.7/site-packagesになりますか?

よろしくお願いします!

18
quantumflash

これは、PYTHONPATHの正当な使用である可能性があります-virtualenvが触れない環境変数であり、bashPYTHONPATH=/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packagesの環境変数PATHと同じ構文を使用します。 .bashrcまたは同様のもの。この道をたどったら、

  1. これについて仮想環境に通知する必要はまったくありません。変更しようとはしません。

  2. 再リンクは必要ありません、そして

  3. 仮想環境の外にインストールした場合でも、どこにでも移動できます(pip installは常に/usr/local/lib/python2.7/dist-packages/を使用します)。それらを仮想環境内から(アクティブ化されている間に)インストールすると、もちろん仮想環境に配置されます。

16
Thomas

Virtualenvに頭を悩ませているところですが、これまでに述べたよりも簡単な方法があるようです。

  1. virtualenv 1.7 --no-site-packagesがデフォルトの動作であるため、したがって、仮想環境に--system-site-packagesフラグを使用するだけで、パスにdist-packagesを取得できます。Ubuntuに付属の微調整されたvirtualenvを使用する場合です。 ( この答え および これ いくつかの有用な歴史を与える)。私はこれをテストしました、そしてそれは働きます。

    $ virtualenv --system-site-packages .

  2. 私はここでトーマスに同意します-dist-packagesの更新の効果を確認するためにvirtualenvで必要なアクションを確認できません。

  3. python setup.py installでそれをテストした後、それは(再びトーマスが言ったように)まだdist-packagesに行きます。独自のPythonを作成することでそれを変更できますが、それは少し極端です。

6
Danimal

PYTHONPATHは私のために働きます。

vim ~/.bashrc

以下にこの行を追加します。

export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages
source ~/.bashrc
4
hahakubile

ディレクトリ内site-packages、ファイルdist.pthを作成します。ファイルdist.pathに、次のように入力します。../dist-packages

enter image description here

次に、virtualenvを非アクティブ化してアクティブ化します。設定する必要があります。

2
Mayank Jaiswal

ここで達成したいのは、基本的に特定のフォルダー(dist-packages)をPython検索パスに追加することです。これにはいくつかのオプションがあります。

  1. パス構成(.pth)ファイルを使用すると、エントリがシステムパスに追加されます。
  2. PYTHONPATHを変更します(そこからのエントリはシステムパスの先頭に移動します)。
  3. Pythonスクリプトから直接、sys.pathを変更します。つまり、必要なフォルダを追加します。

この特定のケース(グローバルdist-packagesフォルダーを有効にする)の場合、3番目のオプションの方が良いと思います。最初のオプションでは、仮想環境ごとに.pthファイルを作成する必要があるためです。で作業しています(外部シェルスクリプトを使用していますか?)。パッケージを配布するときに忘れがちです。 2番目のオプションでは、実行時のセットアップ(envvarの追加)が必要ですが、これも見逃しがちです。

また、3番目のオプションのみが、構成時または実行時に前提条件を必要とせず、問題なく配布できます(もちろん、同じタイプのシステム上で)。

次のような関数を使用できます。

def enable_global_distpackages():
    import sys
    sys.path.append('/usr/lib/python2.7/dist-packages')
    sys.path.append('/usr/local/lib/python2.7/dist-packages')

そして、パッケージの__init__.pyファイル:

enable_global_distpackages()
0
Palasaty