26

そのため、誰もがpipとvirtualenvを使用するように言っていますが、現在のアプローチよりも優れていることを誰も説明できません。人々がpipとvirtualenvを使用する主な理由は、他のすべての人がそれを使用していることのようです...

PIPとvirtualenvを使用するのには非常に正当な理由があると確信していますが、Googleでそれらを見つけることができませんでした。stackoverflowコミュニティの誰かが私にそれらを説明できることを願っています。

現在、Djangoプロジェクトを整理する方法は次のとおりです。

site/src/ : contains all python-only dependencies of my project

site/lib/ : contains symlinks to the python packages

site/[projectname]/ : contains all my project specific code

サイトフォルダ全体が私のリポジトリにチェックインされます(はい、django自体などのすべてのPythonのみの依存関係を含みます)。

Pythonのみ以外のすべての依存関係(PIL、psycopg2、...)は、READMEに文書化されており、システムレベルでインストールされます(apt-get install ....)

たとえば、django-1.2.3、pygeoip-0.1.3、およびpsycopg2に依存するプロジェクト名「projectfoo」があるとします。

/usr/lib/python2.5/site-packages/psycopg2

~/projects/foo/site : checkout of my repository
~/projects/foo/site/src/django-1.2.3
~/projects/foo/site/src/pygeoip-0.1.3
~/projects/foo/site/lib/django -> symlink to ../src/django-1.2.3/django
~/projects/foo/site/lib/pygeoip -> symlink to ../src/pygeoip-0.1.3/pygeoip
~/projects/foo/site/projectfoo/

では、これは実際のPIP / virtualenvとどのように比較されますか?

私の現在のアプローチでプロジェクトを展開する

svn checkout https://myserver.com/svn/projectfoo/tags/1.0.0STABLE/site

PIP / virtualenvを使用したデプロイ

wget https://myserver.com/svn/projectfoo/tags/1.0.0STABLE/projectfoo-requirements.txt
pip install -U -E projectfoo-venv -r projectfoo-requirements.txt

私の現在のアプローチでプロジェクトに取り組んでいます

cd ~/projects/foo/site/projectfoo
export PYTHONPATH=.:..:../lib
./manage.py runserver 0:8000

PIP / virtualenvを使用したプロジェクトでの作業

workon projectfoo
cd path/to/project
./manage.py runserver 0:8000

Pythonのみ以外の依存関係の処理

Python以外の依存関係も同じように処理され--no-site-packagesます。virtualenvのオプションを使用してコンパイラとすべてのビルド依存関係をサーバーにインストールする方法はありません。実際にそれを行っている人はいないと思います。とりあえず。

私の現在のアプローチでPythonのみの依存関係をアップグレードする

srcで新しいバージョンをチェックアウト/解凍し、srcから古いバージョンを削除し、libでシンボリックリンクを更新してコミットします。これで、プロジェクトに取り組んでいる他のすべての人が、次のsvn upまたはで更新を取得しgit pullます。良くないことの1つは、srcに古いフォルダーが含まれている場合にそのフォルダーが残ることです。これは、ローカルコピーを更新する前にすべてのpycを削除することで簡単に回避できます。

PIP / virtualenvを使用したPythonのみの依存関係のアップグレード

要件ファイルの新しいバージョンをコミットします。プロジェクトで作業しているすべての人が、ローカルコピーを更新して実行すると、新しいバージョンに気付くことができれば幸いですpip install -E projectfoo-venv -r requirements.txt

編集:pipでの-Uの使用を削除しました。これはpip8.2では必要ありません。

編集:私の現在のアプローチに対するpip / virtualenvの唯一の利点は、異なるバージョンのpythonを必要とする異なるプロジェクトで作業する場合にあるようです。しかし、私の経験では、Pythonの異なるバージョンが必要な場合、他のシステムライブラリ(PIL、psycopg2、...)の異なるバージョンも必要であり、virtualenvはそれを助けません(あなたが-を使用するのに十分狂っている場合を除いて) no-site-packageオプション、それでも不完全です)。その状況で私が考えることができる唯一の解決策は、さまざまな仮想マシンを使用することです。

だから私は何が欠けていますか?PIPまたはvirtualenvが私がやっていることよりも優れているユースケースを誰かが私に指摘できますか?

4

4 に答える 4

19

virtualenv は、多数のプロジェクトがあり、すべてのプロジェクトで同じ Python インストールを共有したくない場合に非常に役立ちます。たとえば、競合する要件を持つ 2 つのプロジェクトがあるとします。

于 2010-12-19T16:52:35.847 に答える
9

「すべての非 Python のみの依存関係 (PIL、psycopg2、...) は README に記載されており、システム レベルでインストールされます (apt-get install ....)」

次に、プロジェクトごとに異なる依存関係を持つことはできず、プロジェクトごとにこれらの依存関係の異なるバージョンを持つことはできません。

その影響の 1 つは、ローカル インストールが本番マシンを正確に反映していないことです。たとえば、本番環境のバグを再現する際に問題が発生する可能性があります。

また、1 つのバージョンを必要とするシステム ツールをインストールすると、どこでも同じバージョンを使用せざるを得なくなり、プロジェクトが壊れる可能性があります。

また、モジュールの復元は、システムの Python レベルで行う必要があります。Virtualenv は、システムのインストールを汚染することなく、物事をテストするために Python のインストールをセットアップできることを意味します。

プロジェクト用に別の Python を用意し、その Python をプロジェクトから分離するもの (virtualenv や zc.buildout など) を使用することを強くお勧めします。

PIP は、モジュールをインストールする簡単な方法であるだけでなく、モジュールのアンインストールにも役立ちます。

「virtualenv の --no-site-packages オプションを使用して、サーバーにコンパイラとすべてのビルド依存関係をインストールする方法はありません。とにかく、実際にそれを行っている人はいないと思います。」

いいえ、私は zc.buildout を使用しますが、ほとんど同じことになりますが、作業は少なくなります。;)

于 2010-12-19T16:55:21.790 に答える
3

私の通常のプロジェクトでは、pip/virtualenv なしで提案された方法に従います。 これにより、パッケージを特定のディレクトリに配置できます。

+ext
  |
  |------python packages
+source
  |
  |------ project code and packages

そして通常、起動スクリプトで PYTHONPATH を更新します

export PYTHONPATH="";
export PYTHONPATH="${PYTHONPATH}:${workingdir}/path/to/ext";

これには、プロジェクトと依存関係を自己完結型に保つという利点があります。私はエコーします、あなたの考えはここにあります。

しかし、私は virtualenv の使用を見つけました。

  1. で実験する必要がありsomething newます。
  2. two different versions of packageそれらを使用して比較したい場合はさらに優れています。
  3. 別の用途は where, I keep different related packages that can be used across projects.

例:ドキュメンテーション: 私がインストールしたいくつかの重要なパッケージには、sphinx、pygraphwiz、nterworkX、およびいくつかの視覚化パッケージが含まれます。私はそれをプロジェクト全体で使用し、システムレベルのインストールから遠ざけて、汚染されないようにしています.

チェックアウトもお願いします:Yolk。pip/virtualenv の組み合わせがいいと思います。

パッケージを一覧表示できます

yolk -l
Jinja2          - 2.5.5        - active 
Markdown        - 2.0.3        - active 
Pycco           - 0.1.2        - active 
......

そしてpypiの更新をチェックしてください。

yolk --show-updates
Pycco 0.1.2 (0.2.0)
Sphinx 1.0.4 (1.0.5)
pip 0.8.1 (0.8.2)
于 2010-12-19T16:59:50.147 に答える
2

PIP/virtualenv を使用したデプロイ:

あなたによると:

wget https://myserver.com/svn/projectfoo/tags/1.0.0STABLE/projectfoo-requirements.txt
pip install -U -E projectfoo-venv -r projectfoo-requirements.txt

私がすること:私もパッケージを「フリーズ」しますが、プロジェクト全体をチェックインしますpipvirtualenvPython パッケージを含みます。したがって、私の展開はあなたのものとまったく同じです:

svn checkout https://myserver.com/svn/projectfoo/tags/1.0.0STABLE/site

PIP/virtualenv を使用したプロジェクトの作業:

あなたによると:

workon projectfoo
cd path/to/project
./manage.py runserver 0:8000

私がすること: 次のようなpostactivate フックを追加します。

$ cat bin/postactivate
cd $VIRTUAL_ENV
./manage.py runserver 0:8000
$

次に、プロジェクトに変更します。

workon projectfoo
于 2010-12-19T18:18:08.270 に答える